我想測試一個使用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