Как сохранить в контроллере Rails тест RSpec DRY при введении приватного метода? - PullRequest
1 голос
/ 17 февраля 2012

В настоящее время в нашем контроллере определено одно действие, и мы проверяем его с помощью 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

Как видите, эта спецификация не очень СУХА.

Любое руководство?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Вы можете использовать

  • вспомогательные методы и модули RSpec или
  • Пользовательские соответствия RSpec или
  • Общие примеры RSpec или
  • Общие контексты RSpec

См. Различные способы повторного использования кода в Rspec .

2 голосов
/ 17 февраля 2012

Вам просто нужно сделать shared_examples.

shared_examples "common" do
  it "should do something common 1"
  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_behave_like "common"
  it "should do something unique to action2"
end

Вы можете увидеть документацию по rspec: https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples

0 голосов
/ 17 февраля 2012

Вы можете напрямую протестировать общий материал, если хотите: извлеките его в сотрудничающий класс и протестируйте этот класс.Затем заглушите соавтора в тесте контроллера.

Если вы не хотите этого делать, то, вероятно, лучшим выбором будут общие примеры.Обратите внимание, что общие примеры в действительности параметризуются контекстом, в котором они используются:

shared_examples "common" do
  it "does something common" do
    subject.should be_whatever
  end
end

describe "POST 'action1'" do
  subject { post :action1 }
  it_behaves_like "common"
end

describe "POST 'action2'" do
  subject { post :action2 }
  it_behaves_like "common"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...