我是 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
(例如,没有before
,let
等),然后执行以下操作:
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/