Ruby on rails 测试委托给另一个对象的方法

Ruby on rails 测试委托给另一个对象的方法,ruby-on-rails,ruby,unit-testing,rspec,Ruby On Rails,Ruby,Unit Testing,Rspec,这是我项目中的一个模型- class Subscription < ActiveRecord::Base def active? SubscriptionValidationPolicy.new(self).active? end end 类订阅

这是我项目中的一个模型-

class Subscription < ActiveRecord::Base
  def active?
    SubscriptionValidationPolicy.new(self).active?
  end
end
类订阅
当我在单元测试
active?
时,我应该为活动和非活动状态设置
subscription
并对其进行断言,还是应该为
SubscriptionValidationPolicy
创建一个双精度,以某种方式将其插入,然后断言是否对其调用了
active?

或者这一切都只是我如何进行测试的自以为是。无论如何,我将要测试
SubscriptionValidationPolicy
,因此对
Subscription\35; active?
方法进行“基于状态”的测试感觉是多余的


希望对此有一些想法:)

我同意@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#active?
以了解
SubscriptionValidationPolicy
规范中的逻辑注意事项

无论如何,如果你测试这个策略,我会使用double,但这主要是基于观点的…我甚至不会费心测试这个方法。它是一个单行程序,执行简单的委托,没有任何条件逻辑。再说一遍,我还要说,你的模型根本不应该像这样对业务逻辑进行授权;第一个it块可以更改为:
subscription.active?期望(SubscriptionValidationPolicy).接收(:new).with(subscription)
仅仅因为我喜欢arrange-act-assert(当时给出)模式:D@seanriordan08更新是因为它确实有助于更干净的重构,在重构中调用也可以移动到before块。非常感谢各位。很有帮助