Как запустить произвольный метод объекта из строки в ruby? - PullRequest
5 голосов
/ 14 февраля 2010

Итак, я довольно новичок в ruby ​​в целом и пишу несколько тестов rspec для объекта, который я создаю. Многие тестовые примеры довольно просты, и я просто хочу убедиться, что значения заполняются и возвращаются правильно. Мне интересно, есть ли способ сделать это с помощью зацикливающей конструкции. Вместо того, чтобы иметь assertEquals для каждого из методов, которые я хочу проверить.

Для установки:

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 ]

6 голосов
/ 14 февраля 2010

object.send(:method_name) или object.send("method_name") будут работать.

Так в вашем случае

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

должен делать то, что вы хотите.

1 голос
/ 14 февраля 2010

пара очков о Object#send() ...

Вы также можете указать параметры для вызова метода ...

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

Мне нравится использовать эту другую форму __send__, потому что "отправить" так часто встречается ...

an_object.__send__(:a_method)
1 голос
/ 14 февраля 2010

Если вы делаете

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

Это приведет к запуску вашей спецификации в качестве отдельного примера спецификации для каждого свойства, и в случае сбоя вы узнаете, что вышло из строя. Это также следует правилу одного утверждения для каждого теста / примера спецификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...