Заглушки RSpec & макеты на родственные отношения - PullRequest
0 голосов
/ 03 декабря 2010

Я пытаюсь разобраться в невероятно запутанном синтаксисе RSpec, по крайней мере на начальном этапе, пытаясь расширить спецификации по умолчанию, которые генерируются с помощью скаффолдинга Rails 3 ...

У меня есть связанные модели ... очень просто:

#clown.rb
class Clown < ActiveRecord::Base
  has_many :rabbits
end

#rabbit.rb
class Rabbit < ActiveRecord::Base
  belongs_to :clown
end

но у меня проблемы с rabbits_controller.spec.rb. В этом спецификации перестают работать, когда я ссылаюсь, скажем, клоун. имя в одном из взглядов кролика. глупое простое приложение работает, как и ожидалось, но спецификации терпят неудачу, потому что я не заглушил (или насмехался?) клоуна, чтобы ответить правильно от кролика (или, по крайней мере, это то, что я думаю, что происходит)?!? Как мне добавить заглушку (или издеваться над клоуном, с которым связан кролик?).

существующий:

   #rabbits.controller.spec.rb
    require 'spec_helper'

    describe RabbitsController do

      def mock_rabbit(stubs={})
        (@mock_rabbit ||= mock_model(Rabbit).as_null_object).tap do |rabbit|
          rabbit.stub(stubs) unless stubs.empty?
        end
      end

      describe "GET index" do
        it "assigns all rabbits as @rabbits" do
          Rabbit.stub(:all) { [mock_rabbit] }
          get :index
          assigns(:rabbits).should eq([mock_rabbit])
        end
      end

  ...

1 Ответ

1 голос
/ 03 декабря 2010

ИМХО (и есть другие точки зрения), это не насмешливая или тупая ситуация. Макеты и заглушки отлично подходят для внешних зависимостей (например, веб-службы), но это является внутренним для вашего приложения. То, что вам нужно, это что-то вроде factory_girl, которое позволит вам создавать тестовые данные без головной боли чего-то вроде осветителей или попыток макетировать все зависимые отношения, что быстро становится монотонным. У factory_girl есть отличная документация, но вкратце вот как может выглядеть ваша фабрика:

Factory.define(:clown) do |f|
  f.rabbits{|c| [c.assocation(:rabbit)]}
  f.name "Pierrot"
end

Factory.define(:rabbit) do |f|
  f.association :clown
end

Затем вы использовали бы их в своем тесте так:

describe RabbitsController do 
  describe "GET index" do 
    it "assigns rabbits" do
      @rabbit = Factory(:rabbit)
      get :index
      assigns[:rabbits].should == [@rabbit]      
    end
  end
end
...