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块。非常感谢各位。很有帮助