如何在ruby中从字符串运行任意对象方法?

时间:2010-02-14 02:17:50

标签: ruby testing rspec

所以我对ruby很新,我正在为我正在创建的对象编写一些rspec测试用例。很多测试用例都是相当基础的,我只想确保正确填充和返回值。我想知道我是否有办法用循环结构来做这件事。而不是必须为我想测试的每个方法都有一个assertEquals。

对于instace:

describe item, "Testing the Item" do

  it "will have a null value to start" do
    item = Item.new
    # Here I could do the item.name.should be_nil
    # then I could do item.category.should be_nil
  end

end

但我想要一些方法来使用数组来确定要检查的所有属性。所以我可以做类似

的事情
propertyArray.each do |property|
  item.#{property}.should be_nil
end

这或类似的东西会起作用吗?感谢您的任何帮助/建议。

3 个答案:

答案 0 :(得分:6)

object.send(:method_name)object.send("method_name")将有效。

所以在你的情况下

propertyArray.each do |property|
  item.send(property).should be_nil
end

应该做你想做的事。

答案 1 :(得分:1)

如果你这样做

propertyArray.each do |property|
  item.send(property).should be_nil
end

在单个规范示例中,如果您的规范失败,那么将很难调试哪个属性不是nil或什么失败。更好的方法是为每个属性创建一个单独的规范示例,如

describe item, "Testing the Item" do

  before(:each) do
    @item = Item.new
  end

  propertyArray.each do |property|

    it "should have a null value for #{property} to start" do
      @item.send(property).should be_nil
    end

  end

end

这会将您的规范作为每个属性的不同规范示例运行,如果失败,那么您将知道失败的原因。这也遵循每个测试/规范示例的一个断言规则。

答案 2 :(得分:1)

关于Object#send() ...

的几点意见

您也可以为方法调用指定参数...

an_object.send(:a_method, 'A param', 'Another param')

我喜欢使用另一种形式__send__,因为“发送”非常常见......

an_object.__send__(:a_method)