ruby-on-rails - 为什么不能在其中分配值或在 rspec 上分配特殊 block

标签 ruby-on-rails testing rspec factory-bot shoulda

我是 Rails 新手,我想用 rspec、shoulda 和 factory girl 测试现有的 Rails 项目。
我尝试为模型的变量赋值,但我不能。
这是错误;

Failure/Error: @brief.brand_info = 'bla bla bla'
  NoMethodError:
    undefined method `brand_info=' for nil:NilClass
  # ./spec/models/brief_spec.rb:34:in `block (3 levels) in <top (required)>'

你可以通过访问这个 ...link... 找到我的模型和工厂

简述工厂代码;

Factory.define :brief, :class => Brief do |b|
  b.brand_info 'brand info'
  b.duration 14
end

项目工厂代码;

Factory.define :project, :class => Project do |p|
  p.association :owner, :factory => :customer

  p.title 'project title'
  p.description 'project description'
  p.stage :brief_completed
  p.contest_type :standard

  p.brief {|p| p.association(:brief)}
  p.association :project_type, :factory => :project_type
end

Factory.define :project_with_prize, :parent => :project do |p|
  p.prize 5000
  p.stage :prize_determined
end

Factory.define :project_waiting_for_payment, :parent => :project_with_prize do |p|
  p.stage :awaiting_payment
end

Factory.define :project_started, :parent => :project_with_prize do |p|
  p.start Time.zone.now
  p.end Time.zone.now.advance(:days => 14)
  p.stage :started
end

Factory.define :project_started_with_no_brief, :parent => :project_with_prize do |p|
  p.brief nil
  p.start Time.zone.now.advance(:days => -10)
  p.end Time.zone.now.advance(:days => 4)
  p.stage :started
end

Factory.define :project_overdue, :parent => :project_with_prize do |p|
  p.start Time.zone.now.advance(:days => -14)
  p.end Time.zone.now.advance(:minutes => -15)
  p.stage :started
end

Factory.define :project_ended, :parent => :project_with_prize do |p|
  p.start Time.zone.now.advance(:days => -15)
  p.end Time.zone.now.advance(:days => -1)
  p.stage :ended
end

Factory.define :project_revising, :parent => :project_ended do |p|
  p.stage :revising
end

Factory.define :project_delivering_files, :parent => :project_ended do |p|
  p.stage :delivering_files
end

Factory.define :project_completed, :parent => :project_ended do |p|
  p.stage :completed
end


Factory.define :faulty_project, :parent => :project do |p|
  p.title nil
end

最佳答案

失败消息包含一些线索:

  • undefined method 'brand_info=' for nil:NilClass 表示 #brand_info= 方法在未定义它的对象上被调用;在这种情况下,nil
  • Failure/Error: @brief.brand_info = 'bla bla bla' 显示发生这种情况的代码行。出于某种原因,@brief 在您的规范中为 nil,但您尚未发布规范代码,因此我无法告诉您原因。

我建议从一个简单的规范开始,它只使用describe/it(例如,没有beforelet等),然后执行以下操作:

describe Brief do
  it 'assigns the brand info' do
    brief = Brief.new
    brief.brand_info = 'bla bla bla'
  end
end

一旦你完成了这项工作,你就可以用调用 factory girl 来替换 Brief.new(如果你真的需要 Factory girl 提供的额外设置——但要知道这是额外的逻辑会减慢你的规范),一旦你有多个需要在 brief 实例上操作的示例,你就可以重构为 let

关于ruby-on-rails - 为什么不能在其中分配值或在 rspec 上分配特殊 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029147/

相关文章:

ruby-on-rails - 如何在 simple_form 中添加原始 html?

javascript - mocha 中的“it”无法使用 await 运行

ruby-on-rails - 升级到 RSpec 3 并遵循弃用通知会导致 "undefined method ' 允许'"

ruby-on-rails-3 - 自动完成方法拒绝在 RSpec 测试中触发

ruby-on-rails - Jasmine CI和在Jenkins服务器上捕获测试结果输出

ruby-on-rails - 设计确认 : No routes matches

ruby-on-rails - 在表单标签中包含链接吗?

testing - 断言错误 : Missing expected exception when testing async requirejs call using mocha

testing - 是否可以使用 Watin 查看页面加载后的响应 header 是什么

ruby - 在 ruby​​ 中测试线程代码