在我所有的 ruby on rails 应用程序中,我尽量不在 Controller 中使用数据库,因为它们应该独立于持久性类。我改用模拟。
这里是 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
但是如果 Controller 包含更复杂的范围,比如:
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
最佳答案
你可以为此使用 stub_chain
方法。
类似于:
Coupon.stub_chain(:unredeemed, :by_shop, :by_country).and_return(result)
只是一个例子。
关于ruby-on-rails - 在 Rails 中测试范围链的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10863675/