我想测试一个使用ActiveRecord适量的方法。我一直听说单元测试方法,而不是使用数据库是最好的方法。然而,这对我来说的缺点是如果你错误地存活了ActiveRecord的响应呢?我可能会错误地将任何ActiveRecord在现实中返回的内容剔除,现在我的测试不准确。单元测试具有两个数据库查询的方法。我应该剔除数据库调用吗? Rails/Rspec
FYI一个user
有许多coupons
和(当它应用于order
的次)coupon
可以有很多coupon_uses
。
这是我的方法:
def get_coupons_and_uses_for_user
coupons = Promotions::Coupon
.includes(:coupon_uses)
.where(user_id: user_id)
coupons.reduce([]) do |memo, c|
memo << { coupon: c, coupon_uses: c.coupon_uses.order('created_at desc') }
end
end
上述方法(这基本上查询用户的优惠券,然后返回其使用相关联的每个优惠券)有两个ActiveRecord的要求,这两者我需要的,如果存根出我没有在我的测试中使用一个数据库:
Promotions::Coupon.includes(:coupon_uses).where(user_id: user_id)
和
c.coupon_uses.order('created_at desc') #The .order causes ActiveRecord to hit the database
这里我的测试:
describe "#get_coupons_and_uses_for_user" do
subject { service_instance.get_coupons_and_uses_for_user }
let(:service_instance) { described_class.new(user_id) }
let(:user_id) { 1 }
let(:coupon1) { build_stubbed(:coupon) }
let(:coupon2) { build_stubbed(:coupon) }
let(:coupons) { [coupon1, coupon2] }
let!(:coupon_use1) { build_stubbed(:coupon_use) }
let!(:coupon_use2) { build_stubbed(:coupon_use) }
let!(:coupon_use3) { build_stubbed(:coupon_use) }
let!(:coupon_use4) { build_stubbed(:coupon_use) }
before do
allow(Promotions::Coupon).to receive_message_chain(:includes, :where) { coupons }
allow(coupon1).to receive_message_chain(:coupon_uses, :order) { [coupon_use1, coupon_use2] }
allow(coupon2).to receive_message_chain(:coupon_uses, :order) { [coupon_use3, coupon_use4] }
end
it "returns the user's coupons associated with their coupon uses" do
expect(subject).to eq(
[
{
coupon: coupon1,
coupon_uses: [coupon_use1, coupon_use2]
},
{
coupon: coupon2,
coupon_uses: [coupon_use3, coupon_use4]
}
]
)
end
end
这是测试的好办法?或者我应该使用数据库?为什么或者为什么不?
这里的问题是,我碰伤了我的ActiveRecord的返回值调用是这样的:
allow(coupon1).to receive_message_chain(:coupon_uses, :order) { [coupon_use1, coupon_use2] }
但是,如果我错了,什么该查询返回(想象一下,如果查询较多什么复杂)。这是一个有效的关注吗?
可能的重复[测试方法是大量的数据库查询。单元测试可以吗?](https://stackoverflow.com/questions/46332283/testing-methods-were-lots-of-database-queries-in-them-is-it-okay-to-unit-test ) – jvillian