如何使控制器规格完全隔离?

时间:2014-02-03 01:03:09

标签: ruby-on-rails rspec

这是我正在创建的规范:

  describe 'POST create' do
    let!(:user){ mock_model(User).as_null_object}

    before do
      User.stub(:new).and_return "foobs"
    end

    it{}
  end

现在,嘲讽的全部意义在于您的期望是孤立的,因此您确切地知道应用程序出错的地方,并且您不会在一个错误的方法中产生影响(如在集成规范中)会导致一百个规格失败。

考虑到这一点,如果我不触摸我的用户模型,则上述空的期望通过。如果我弄乱用户模型的内容,我会收到ActiveRecord错误,如果我完全删除了用户模型,我会收到此错误:

 uninitialized constant UsersController::User

我认为mock_model方法(第2行)会嘲笑模型吗?如何使上述规格完全隔离?

1 个答案:

答案 0 :(得分:0)

您似乎需要使用double方法。

  describe 'POST create' do
    let(:user) { FactoryGirl.build :user }  
    before do
      User = double # the name of this variable could be anything. 
    end

    it "" do
        User.should_recieve(:new).with(user).and_return user
        User.should_recieve(:save).and_return true
        post :create
    end
  end

double创建null对象。然后,您对该对象运行期望,而不是实际的模型对象。它可以像任何对象一样“接收”其方法的请求,我们可以嘲笑它们。

如果我做错了,请告诉我!