在rspec测试中将模型实例传递给辅助方法

时间:2014-06-11 11:24:26

标签: ruby-on-rails ruby rspec

我的应用程序中有一个帮助方法位于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'

我是铁路新手

2 个答案:

答案 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。