2010-02-14 2 views
5

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

Для 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 

Будет ли это или как-то работает? Спасибо за любую помощь/предложения.

ответ

6

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

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

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

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

+0

Спасибо! Я знал, что должен быть способ сделать это. – Boushley

1

Если вы

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

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

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 

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

1

Пару точек около Object#send() ...

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

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

Я хотел бы использовать эту другую форму __send__, потому что «отправить» настолько часто ...

an_object.__send__(:a_method) 
Смежные вопросы