使用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
不錯的建議,但是,我已經使用數據庫清理寶石。它設置爲在':each'測試之間運行。當這個問題出現時,我也仔細考慮了這一點,但我仔細檢查了配置,看起來沒問題。以防萬一,我會將我的數據庫清理器配置添加到主要問題中。 –
另一種較老的,擴展性較差的方法是在運行測試之前創建所有數據庫設備,以便實際上不會實時創建對象。但是,這使得將測試數據維護在一個大型的代碼庫中相當困難。 – photoionized
@WesFoster:編輯我的迴應與實際的錯誤。之前沒有打擾讀取堆棧跟蹤。編輯中的答案是真正的問題,而不是數據庫清理。 – photoionized