Понимание сгенерированных спецификаций RSpec 2 - PullRequest
1 голос
/ 29 ноября 2010

Я думаю, что могу откусить больше, чем могу прожевать, пытаясь самостоятельно выучить RSpec ... По всей видимости, нет полной документации по RSpec 2?!? по крайней мере, ничего, что мне удалось найти ...

Во всяком случае, я в слабой попытке интегрировать RSpec начал с изучения 29 спецификаций, созданных генератором скаффолдов в Rails 3. Некоторые из них я понимаю, но многое все же ускользает от меня. Надеюсь, кто-то может помочь (или указать мне на приличную документацию RSpec 2).

Например, в первом блоке кода ниже (def mock_clown...) Я могу предположить, что mock_clown создает макет моего класса Clown для проверки. Но что именно происходит? что порождает этот "макет"? что означают .as_null_object и .tap? Это очень запутанно, так как я не могу найти пример для сравнения этого блока в любых документах или руководствах, с которыми я сталкивался ...

#clowns_controller_spec.rb

require 'spec_helper'

describe ClownsController do

  def mock_clown(stubs={})
    (@mock_clown ||= mock_model(Clown).as_null_object).tap do |clown|
      clown.stub(stubs) unless stubs.empty?
    end
  end

  describe "GET index" do
    it "assigns all clowns as @clowns" do
      Clown.stub(:all) { [mock_clown] }
      get :index
      assigns(:clowns).should eq([mock_clown])
    end
  end

... 


  describe "POST create" do

...


    describe "with invalid params" do
      it "assigns a newly created but unsaved clown as @clown" do
        Clown.stub(:new).with({'these' => 'params'}) { mock_clown(:save => false) }
        post :create, :clown => {'these' => 'params'}
        assigns(:clown).should be(mock_clown)
      end

      it "re-renders the 'new' template" do
        Clown.stub(:new) { mock_clown(:save => false) }
        post :create, :clown => {}
        response.should render_template("new")
      end
    end

...

end

1 Ответ

4 голосов
/ 29 ноября 2010

Лучшим источником документации для rspec, вероятно, являются его github wiki. Вот общая ссылка на все драгоценные камни: https://github.com/rspec/rspec/wiki. Кроме того, ознакомьтесь с rdoc, связанный здесь .

Что касается конкретных ответов, то as_null_object заставляет mock записывать и игнорировать все вызовы методов. (Это замечательно, поскольку вам не нужно указывать каждый отдельный метод объекта, а только те, которые вам нужны.)

Tap - это функция Ruby 1.9. Из документации по этой ссылке :

Объект # водопроводных

Передает объект в блок и возвращает его (предназначенный для использования в цепочке вызовов).

Для самостоятельного изучения Rspec 2 Webrat и Cucumber я настоятельно рекомендую ознакомиться с Книгой RSpec. Потрясающий ресурс, охватывающий все аспекты.

...