В настоящее время в нашем контроллере определено одно действие, и мы проверяем его с помощью RSpec. Теперь нам нужно создать второе действие, которое должно повторно использовать большинство функций, содержащихся в первом действии.
Следовательно, мы преобразуем этот общий код в закрытый метод, а затем оба действия вызовут закрытый метод.
Вопрос в том, где мы тестируем функциональность этого частного метода? Имейте в виду, что он делает много вещей.
Я знаю, что мы никогда не должны напрямую тестировать приватные методы, а скорее тестировать открытый интерфейс, который в свою очередь будет тестировать приватный метод. Конечно, мы хотели бы сохранить наши спецификации СУХОЙ и не повторять все общие функциональные спецификации в каждом «описании», не так ли?
Пример класса:
class MyController < ApplicationController
def action1
...
# Do something unique to 'action1'
...
my_object = ...
do_some_common_stuff(my_object)
end
def action2
...
# Do something unique to 'action2'
...
my_object = ...
do_some_common_stuff(my_object)
end
private
def do_some_common_stuff(my_object)
# Do something common 1
# Do something common 2
# Do something common 3
# Do something common 4
# Do something common 5
end
end
Пример теста Spec:
describe MyController do
describe "POST 'action1'" do
it "should do something unique to action1"
it "should do something common 1" do
some_object.should_receive(:a_call)
post :action1
end
it "should do something common 2"
it "should do something common 3"
it "should do something common 4"
it "should do something common 5"
end
describe "POST 'action2'" do
it "should do something unique to action2"
it "should do something common 1" do
some_object.should_receive(:a_call)
post :action2
end
it "should do something common 2"
it "should do something common 3"
it "should do something common 4"
it "should do something common 5"
end
end
Как видите, эта спецификация не очень СУХА.
Любое руководство?