如何直接在上下文中包含FactoryGirl方法,例如create
?
例如,当我在上下文之外时,这将起作用
role_all = create(:role, name: 'all')
因为我的spec_helper.rb
我有以下内容,
config.include FactoryGirl::Syntax::Methods
但是当我在上下文中时,我需要在方法调用之前包含FactoryGirl.
,如此,
context 'has role all' do
role_all = FactoryGirl.create(:role, name: `all`)
subject(:user) { FactoryGirl.create(:user, roles: [ role_all ]) }
# test assumptions on user
end
有人有任何想法吗?
答案 0 :(得分:4)
您不应该在上下文中设置数据 - 当rspec收集所有示例并且不会再次执行时,它只被读取一次。如果它当前有效,那只是因为您没有为每个可能导致某些问题的测试重置数据库。而是使用before
挂钩:
context 'has role all' do
before(:each) { @role_all = create(:role, name: `all`) }
end
另请注意,subject
块在声明时不会执行 - 每次在测试中调用subject时都会执行它。由于ruby procs带有它们创建的上下文,因此在代码中声明的role_all
不会引发任何异常。但是,每次调用它时,subject
都会返回不同的对象,这可能会使您的测试错过。
TL; DR:
上下文不是为测试设置数据 - 而是设置将在每次测试之前或之后运行的函数。