使用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