2015-05-07 33 views
1

使用Rspec創建簡單的控制器規格時,我遇到了一個非常棘手的問題。造成問題的方法稱爲#set_company,它爲當前登錄的用戶設置父'帳戶'。控制器規格中消失的數據

def set_company 
     return false if !user_signed_in? 

     current_company = Company.find(current_user.company_id) 
     set_current_tenant(current_company) 
    end 

我的規格看起來像這樣:

require 'spec_helper' 

describe Api::V3::UsersController, :type => :controller do 
    describe 'GET #index' do 
    let(:user) { FactoryGirl.create(:user) } 
    let(:company) { user.company } 

    before { 
     allow(controller).to receive(:current_user) {user} 
     allow(controller).to receive(:current_tenant) {company} 
    } 

    it 'returns 200' do 
     get :index 
     expect(response.code.to_i).to eq 200 
    end 

    it 'assigns @users' do 
     get :index 
     expect(assigns(:users)).to eq [user] 
    end 
    end 
end 

的事情是,第二次測試是綠色的,但是第一個是不是(這個順序是正確的!)。它是紅色的,這是因爲,當它被觸發時,不存在company之類的東西。這是怎麼一回事呢:

  1. user正在創建(與company,這是一個依賴),該用戶的ID的是,並與用戶創建一個公司的ID也
  2. 第二個測試被觸發並且一切都很好
  3. 第一個測試被觸發,但在數據庫中沒有ID爲1的Company,有一個新的ID = 2,這顯然是錯誤的,並導致我的set_company方法下降。

我認爲這可能與我正在使用database_cleaner的事實有關,但我完全不知道如何處理這個事情,我該怎麼辦。謝謝大家的任何線索。

回答

0

如果您還沒有基於JavaScript的測試,那麼不需要database_cleaner。只要事務裝置啓用,數據將在每次測試之間自動清除。

+0

其實我有一些JS測試 – mbajur