0

我试图通过尝试扩展使用 Rails 3 脚手架生成的默认规范来解决 RSpec 令人难以置信的令人困惑的语法,至少最初是这样的语法......

我有相关的模型......非常简单:

#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

  ...
4

1 回答 1

1

恕我直言(还有其他观点)这不是一个嘲弄或存根的情况。模拟和存根非常适合外部依赖(想想 Web 服务),但这是您的应用程序内部的。你想要的是像 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
于 2010-12-02T22:44:20.410 回答