2

在我所有的 ruby​​ on rails 应用程序中,我尽量不在控制器中使用数据库,因为它们应该独立于持久性类。我用嘲笑代替。

这是 rspec 和 rspec-mock 的示例:

class CouponsController < ApplicationController
  def index
    @coupons = Coupon.all
  end
end

require 'spec_helper'
describe CouponsController do
  let(:all_coupons) { mock } 
  it 'should return all coupons' do
    Coupon.should_receive(:all).and_return(all_coupons)
    get :index
    assigns(:coupons).should == all_coupons
    response.should be_success
  end
end

但是如果控制器包含更复杂的范围怎么办,比如:

class CouponsController < ApplicationController
  def index
    @coupons = Coupon.unredeemed.by_shop(shop).by_country(country)
  end
end

你知道测试类似作用域链的好方法吗?

我认为以下测试看起来不太好:

require 'spec_helper'
describe CouponsController do
  it 'should return all coupons' do
    Coupon.should_receive(:unredeemed).and_return(result = mock)
    result.should_receive(:by_shop).with(shop).and_return(result)
    result.should_receive(:by_country).with(country).and_return(result)
    get :index
    assigns(:coupons).should == result
    response.should be_success
  end
end
4

2 回答 2

7

你可以使用stub_chain方法。

就像是:

Coupon.stub_chain(:unredeemed, :by_shop, :by_country).and_return(result)

只是一个例子。

于 2012-06-02T15:49:45.377 回答
0

使用rspec > 3此语法:

expect(Converter).to receive_message_chain("new.update_value").with('test').with(no_args)

而不是stub_chain.

在文档中阅读有关消息链的更多信息。

于 2016-03-23T17:11:31.577 回答