2017-10-09 75 views
1

這是在我的項目的典範 -測試方法委託給另一個對象

class Subscription < ActiveRecord::Base 
    def active? 
    SubscriptionValidationPolicy.new(self).active? 
    end 
end 

當我的單元測試active?,我應該設置一個subscription活動和非活動狀態和上還是應該斷言我爲SubscriptionValidationPolicy做了一個雙精度型,以某種方式注入它,然後確定是否調用active??或者是否全都只是自以爲是的我怎麼去測試這個。無論如何,我將要測試SubscriptionValidationPolicy,因此對於Subscription#active?方法執行「基於狀態」的測試感覺是多餘的。

很想在這一些想法:)

+2

如果你測試的政策反正比我會使用雙重,但這主要是基於意見的... – spickermann

+1

我甚至不打擾現在測試該方法。這是一個簡單的委託,沒有任何條件邏輯。再說一遍,我也會說你的模型不應該有這樣的業務邏輯代理。 –

回答

3

我同意@spickermann我會設置如下測試:

#spec/models/subscription_spec.rb 
# 
describe Subscription do 

    let(:subscription) { Subscription.new } 
    context '#active? delegation' do 
    let(:policy) {spy('subscription_validation_policy')} 
    before :each do 
     allow(SubscriptionValidationPolicy).to receive(:new).and_return(policy) 
     subscription.active? 
    end 

    it 'instantiates a SubscriptionValidationPolicy with self' do 
     expect(SubscriptionValidationPolicy).to have_received(:new).with(subscription) 
    end 
    it 'calls SubscriptionValidationPolicy#active?' do 
     expect(policy).to have_received(:active?) 
    end 
    end 
end 

然後實際上是在規範的SubscriptionValidationPolicy邏輯考慮測試SubscriptionValidationPolicy#active?

+1

可讀性差;第一個_it_塊可以更改爲: 'subscription.active? expect(SubscriptionValidationPolicy).to have_received(:new).with(subscription)' 僅僅因爲我喜歡_arrange-act-assert_(_given-when-then_)模式:D – seanriordan08

+1

@ seanriordan08由於它確實使一個更清潔的重構,其中的電話可以被移動到前面的塊以及 – engineersmnky

+0

不錯。非常感謝這些人。很有幫助 –

相關問題