我的应用程序中有一个帮助方法位于spec/support/utilities.rb
我试图将一个模型对象的实例传递给它,但我还没有成功,所以测试失败
这是辅助方法
def attribute_not_present(model_instance,model_attrib)
describe "when #{model_attrib} is not present" do
before { model_instance.send("#{model_attrib}=", " ") }
it { should_not be_valid }
end
end
在spec/model/tool_spec.rb
我有这个
require 'spec_helper'
describe Tool do
before do
@tool = FactoryGirl.create(:tool)
end
@attribute_array = ["kind", "serial_number", "department", "size",
"description", "hours", "length"]
subject { @tool }
#checks for absence of any of the required attributes
@attribute_array.each { |tool_attribute|
attribute_not_present(@tool,tool_attribute)
}
end
帮助
中似乎无法识别@tool
样本失败就是这个
1) Tool when size is not present
Failure/Error: before { model_instance.send("#{model_attrib}=", " ") }
NoMethodError:
undefined method `size=' for nil:NilClass
# ./spec/support/utilities.rb:3:in `block (2 levels) in attribute_not_present'
我是铁路新手
答案 0 :(得分:1)
在调用attribute_not_present
时,@ tool尚不存在。此外,在一种情况下self
是示例组,当实际运行规范时(以及在之前的块内)self是示例组的实例。
你根本不需要通过model_instance
- 你只能使用subject
,即
before { subject.send("#{model_attrib}=", " ") }
然而
您可能还想查看共享示例。
答案 1 :(得分:0)
好的 - 我想我明白你在这里要做什么。您正在尝试进行单元测试,特别是对您的Tool类进行验证,是吗?
如果是这样的话,我个人喜欢使用我发现的shoulda_matchers宝石非常惯用。
举个例子,你可以这样做:
describe Tool do
it { should validate_presence_of(:kind) }
it { should validate_presnece_of(:serial_number) }
end
您甚至可以使用验证做更多事情,比如说您知道:serial_number
只能是一个整数,您可以这样做:
it { should validate_numericality_of(:serial_number).only_integer }
这可能是一种比辅助方法更好的单元级验证方法,因为它更像Ruby。