了解RSpec 2生成的规范

时间:2010-11-29 20:55:27

标签: ruby-on-rails rspec webrat

我想我可能会因为我自己学习 RSpec 而咀嚼的东西超过我的咀嚼......似乎没有任何关于RSpec 2的完整文档?!?至少没有我能找到的......

无论如何,我试图整合RSpec,通过检查Rails 3中脚手架生成器创建的29个规范开始。我理解但仍然有很多人逃避了。希望有人可以提供帮助(或指向我正确的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 个答案:

答案 0 :(得分:4)

rspec的最佳文档来源可能是它的github wiki。以下是所有宝石的一般链接:https://github.com/rspec/rspec/wiki。另外,请检查rdoc,linked to here

至于具体答案,as_null_object会使mock记录并忽略所有方法调用。 (这很好,因为您不必在对象上指定每个方法,只需要指出您关心的方法。)

Tap是Ruby 1.9的一项功能。来自文档at this link

  

对象#抽头

     

将对象传递给块并返回它(用于调用链接)。

为了自己学习Rspec 2 Webrat和Cucumber,我绝对建议您查看the RSpec Book.令人敬畏的资源,并涵盖所有方面。