在RSpec上下文中包含FactoryGirl方法?

时间:2014-01-23 15:42:04

标签: ruby rspec factory-bot

如何直接在上下文中包含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

有人有任何想法吗?

1 个答案:

答案 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:

上下文不是为测试设置数据 - 而是设置将在每次测试之前或之后运行的函数。