Как повторно использовать тестовые дубликаты, используемые во многих спецификациях контроллеров - PullRequest
1 голос
/ 28 декабря 2011

У меня есть приложение Rails, использующее AuthLogic, и я получил возможность использовать test удваивается для перехода к current_user. Для current_user существует ограниченный набор состояний, которые многократно используются во многих спецификациях контроллера.

Продолжая этот пример, представьте себе контроллеры с одинаковой двойной настройкой в ​​каждом контексте. Вы можете видеть, что это много повторяется код. Каков предпочтительный способ применения СУХОГО для этого?

controller_1_spec.rb

require 'spec_helper'

describe Controller1 do

  describe "GET 'index'" do

    context "when user has state A" do
      before(:each) do
        user = double("User")
        user.stub(:state).and_return("A")
        user_session = double("UserSession")
        user_session.stub(:user).and_return(user)
        UserSession.stub(:find).and_return(user_session)
      end

      it "should test something for users with State A" do
        get :index
      end

      it "should test something else for users with State A" do
        get :index
      end
    end

    context "when user has state B" do
      before(:each) do
        user = double("User")
        user.stub(:state).and_return("B")
        user_session = double("UserSession")
        user_session.stub(:user).and_return(user)
        UserSession.stub(:find).and_return(user_session)
      end

      it "should test something for users with State B" do
        get :index
      end

      it "should test something else for users with State B" do
        get :index
      end
    end
  end
end

Является ли лучший способ просто добавить вспомогательные методы в spec_helper или есть что-то более удачное, например?

1 Ответ

1 голос
/ 28 декабря 2011

Переместите код установки в вспомогательные методы, определенные в файле spec_helper.rb или в файле spec / support / {что-то} .rb.

def userInAStateWithSession
  user = double("User")
  user.stub(:state).and_return("A")
  user_session = double("UserSession")
  user_session.stub(:user).and_return(user)
  UserSession.stub(:find).and_return(user_session)
  return user
end

-

describe Controller1 do

  describe "GET 'index'" do

    context "when user has state A" do
      before(:each) do
        user = userInAStateWithSession
      end

      ...
...