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

标签 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

有人知道吗?

最佳答案

您不应该在上下文中设置数据 - 当 rspec 收集所有示例时它只会被读取一次并且不会再次执行。如果它目前有效,那只是因为您没有为每个可能导致某些问题的测试重置数据库。而是使用 before 钩子(Hook):

context 'has role all' do
  before(:each) { @role_all = create(:role, name: `all`) }
end

另请注意,subject block 在声明时不会执行 - 它会在您每次在测试中调用 subject 时执行。由于 ruby​​ proc 带有创建它们的上下文,因此在您的代码中声明的 role_all 不会引发任何异常。然而,您的 subject 将在您每次调用它时返回不同的对象,这可能会导致您的测试失败。

长话短说:

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

关于ruby - 在 RSpec 上下文中包含 FactoryGirl 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312835/

相关文章:

ruby - 我数不清文件中使用了多少次相同的字符

ruby-on-rails - GitLab CI - Redis::CannotConnectError:在 127.0.0.1:6379 上连接到 Redis 时出错

ruby-on-rails - 如何在 Rails 3 中关闭 RSpec 2 的生成器?

ruby-on-rails - RSpec/FactoryGirl - Rails STI - 平等

ruby-on-rails - FactoryGirl - 如何创建记录层次结构?

ruby-on-rails - 未定义方法 attr_accessible

ruby - Emacs 在运行编译命令时忽略了我的路径

Ruby 递减到限制

ruby-on-rails - Rspec 输出格式 : Documentation

ruby-on-rails - 如何一步建立一个带有子工厂的父工厂以通过验证