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

如何在ruby中从字符串运行任意对象方法?,ruby,testing,rspec,Ruby,Testing,Rspec,一般来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。很多测试用例都相当基本,我只想确保正确填充和返回值。我想知道是否有一种方法可以让我用循环构造来实现这一点。而不必为我要测试的每个方法都设置assertEquals 对于Instance: describe item, "Testing the Item" do it "will have a null value to start" do item = Item.new # Here I

一般来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。很多测试用例都相当基本,我只想确保正确填充和返回值。我想知道是否有一种方法可以让我用循环构造来实现这一点。而不必为我要测试的每个方法都设置assertEquals

对于Instance:

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
这个或类似的东西有用吗?感谢您的帮助/建议。

对象。发送(:方法名称)
对象。发送(“方法名称”)
将起作用

那么你的情况呢

propertyArray.each do |property|
  item.send(property).should be_nil
end
应该做你想做的事。

如果你做了

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

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

关于
对象#send()

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

an_object.send(:a_method, 'A param', 'Another param')
我喜欢使用另一种形式,因为“发送”很常见

an_object.__send__(:a_method)

谢谢我知道一定有办法做到这一点。