2015-09-30 37 views
0

使用RSPEC和DEVISE,我可以登錄user來運行我的測試。但是,我最近遇到了一個問題,因爲使用before :each會導致創建多個用戶,這會導致我的測試中斷。登錄用戶,無需在rspec中創建多個用戶

我應該改變我的測試方法嗎?或者改變我的用戶簽名方法?

campaign_controller_spec.rb

before :each do 
    @user = FactoryGirl.create(:user) 
    sign_in :user, @user 
    @business = FactoryGirl.create(:business, user: @user) 
end 

describe "GET #index" do 
    before :each do 
    FactoryGirl.create(:active_campaign, business: @business) 
    FactoryGirl.create(:inactive_campaign, business: @business) 
    end 

    it "no status or type filter" do 
    get :index         # <- LINE 22 OF ERROR 
    expect(assigns(:campaigns).size).to eq 2 
    end 

    it 'status filter' do 
    get :index, status: 'active' 
    expect(assigns(:campaigns).size).to eq 1 
    end 
end 

campaigns_controller.rb

def index 
    # Get current user's campaigns 
    @campaigns = current_user.business.campaigns 

    # Filter by status (constraints are in routes) 
    @campaigns = @campaigns.send(params[:status]) unless params[:status] == 'all' # <- LINE 7 OF ERROR 
end 

的問題是,所有的活動都屬於business與屬於USER-1規範,但在控制器中,這些廣告系列屬於另一個用戶(因爲有多個用戶正在創建),因此沒有任何廣告系列相關聯。

確切的錯誤是:

1) CampaignsController [Signed in] GET #index no status or type filter 
    Failure/Error: get :index 
    TypeError: 
     nil is not a symbol nor a string 
    # ./app/controllers/campaigns_controller.rb:7:in `index' 
    # ./spec/controllers/campaigns_controller_spec.rb:22:in `block (4 levels) in <top (required)>' 

小更新

我有安裝了Database Cleaner寶石,應清除測試之間的DB。下面是配置(以防萬一它是不正確的):

#DatabaseCleaner 
config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

回答

1

當使用factory_girl你要使用類似database_cleaner寶石清潔測試之間的數據庫。退房:

https://github.com/DatabaseCleaner/database_cleaner#user-content-rspec-example

編輯:

意識到你的錯誤不是由你認爲它引起的。這是因爲你在.send(params[:status])params[:status]爲零,因爲它沒有傳遞給get :index ......所以一旦調用.send(nil)就會得到堆棧跟蹤。

+0

不錯的建議,但是,我已經使用數據庫清理寶石。它設置爲在':each'測試之間運行。當這個問題出現時,我也仔細考慮了這一點,但我仔細檢查了配置,看起來沒問題。以防萬一,我會將我的數據庫清理器配置添加到主要問題中。 –

+0

另一種較老的,擴展性較差的方法是在運行測試之前創建所有數據庫設備,以便實際上不會實時創建對象。但是,這使得將測試數據維護在一個大型的代碼庫中相當困難。 – photoionized

+0

@WesFoster:編輯我的迴應與實際的錯誤。之前沒有打擾讀取堆棧跟蹤。編輯中的答案是真正的問題,而不是數據庫清理。 – photoionized