1

我想我可能会通过尝试自己学习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
4

1 回答 1

4

rspec 的最佳文档来源可能是它的 github wikis。这是所有宝石的一般链接:https ://github.com/rspec/rspec/wiki 。此外,请查看链接到此处的 rdoc 。

至于具体答案, as_null_object 导致 mock 记录并忽略所有方法调用。(这很棒,因为您不必指定对象上的每个方法,只需指定您关心的方法即可。)

Tap 是 Ruby 1.9 的一个特性。从此链接的文档中:

对象#tap

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

要自己学习 Rspec 2 Webrat 和 Cucumber,我绝对建议您查看RSpec Book。很棒的资源,涵盖了所有方面。

于 2010-11-29T20:58:03.360 回答