【问题标题】:"Undefined method `build'" when using Rspec + FactoryBotRails使用 Rspec + FactoryBotRails 时出现“未定义的方法‘build’”
【发布时间】:2020-01-30 22:49:06
【问题描述】:

我正在尝试这个名为 FactoryBotRails 的宝石。出于某种原因,当我在我的一个模型单元测试中尝试它时,会引发以下错误。

失败/错误:my_model = build(:my_model)
NoMethodError:
#\

的未定义方法“构建”

我不知道我做错了什么,只要我在网上遵循了几个教程,并执行了相同的步骤。


添加,在:

宝石文件

gem 'factory_bot_rails', '~> 5.1.1'

app/spec/support/factory_bot.rb

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

spec/rails_helper.rb

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

spec/factories/my_models.rb

FactoryBot.define do
  factory :my_model do
    name { 'some name' }
    code { 'some code' }
  end
end

并像这样使用它:

my_model = build(:my_model)

我的配置有什么问题?

【问题讨论】:

  • FactoryBot.build(:my_model)怎么样
  • 你的规范文件中有require 'rails_helper'吗?
  • @ThuyNguyen,我也试过了。但它没有用=/。
  • @AkhayGoyal,是的,我愿意 :)
  • 你能展示你的整个代码块吗,包含build(:my_model)

标签: ruby-on-rails rspec factory-bot rspec-rails ruby-on-rails-6


【解决方案1】:

问题可能不是您在调用什么,而是在哪里您在调用它。 my_model = build(:my_model) 不是您在编写规范时要使用的语法,错误消息看起来可能是您从规范之外调用它?因为如果您从规范中调用它,错误应该类似于ArgumentError: Factory not registered: my_model。规范本身应如下所示:

# spec/models/my_model_spec.rb
require 'rails_helper'

describe MyModel do
  let(:my_model) { build :my_model }

  it { expect(my_model).to be_valid }
end

我还会在您的工厂声明中指定型号名称(即factory :my_model, class: 'MyModel' do)。如果你想和你的工厂一起玩,你可以启动一个测试控制台:

# start rails console in 'test' environment
rails console test
my_model = FactoryBot.build :my_model

请注意,您需要在测试控制台中使用 FactoryBot.build 而不是 build

如果这不能解决您的问题,请使用您尝试运行的规范的内容、您尝试运行它的方式更新您的帖子,并扩展您对 spec/rails_helper.rb 文件的定义。由于您是 RSpec 新手,我还建议您查看 http://www.betterspecs.org/ 以了解最佳实践。

【讨论】:

  • 我遇到了与 OP 相同的问题,但这没有帮助
  • @Jessa ...那么我鼓励您编写自己的问题来解释您自己的设置/配置和错误消息?我根据哪种情况可能导致该错误消息进行了回答,并要求 OP 如果他们的问题没有得到解决,请提供额外的缺失细节。 OP 没有说什么,也没有提供必要的额外缺失细节,你也没有提供任何关于你的设置的细节,所以我不确定你在这里想要完成什么。
  • 感谢您的回复,@Allison。很抱歉回复晚了。我会尽快尝试你提到的^^
【解决方案2】:

据我所知,创建 factorybot 的语法是:

FactoryBot.create :my_model

如果您需要不同的东西,请传递参数哈希:

FactoryBot.create :my_model, name: "John Doe"

对于多个(例如 10 个 my_models):

FactoryBot.create_list :my_model, 10

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多