私がテストしようとしている方法では、このようなコードがあります:私はSomeServiceのインスタンスであると、それはいくつかとメソッドを受け取るかどうかを確認しようとするサービスをスタブしようとしていますとにかくrspecテストでローカル変数をスタブするのですか?
service = if user_activator?
SomeService.new(subscription.user, cookies: cookies)
elsif sub_activator?
SomeOtherService.build(subscription: subscription, cookies: cookies)
end
をこのようなコード:
expect(some_service_instance).to receive(:activate).with(hash_including(
app_context: app_context,
cookies: cookies,
subscription: subscription
))
しかしUserActivationServiceのインスタンスでローカル変数をスタブする方法があります?
私はうまくいくと思いますか?
まず、私は(これは怪しい感じて)条件付きのローカル変数は、このような方法に設定されていることを抽出する必要があります
def service
if some_service_activator?
SomeService.new(subscription.user, cookies: cookies)
elsif sub_activator?
SomeOtherService.build(subscription: subscription, cookies: cookies)
end
end
その後、私が行うことができます。
let(:some_service_instance) { SomeService.new(subscription.user, cookies: cookies) }
allow(<something that returns an instance of the class I am testing>).to receive(:service) { some_service_instance }
その後、
expect(some_service_instance).to receive(:activate).with(hash_including(
app_context: app_context,
cookies: cookies,
subscription: subscription
))
これはコーシャーですか?
いいえ、ローカルをスタブすることはできません。メソッドにスタブする必要がある参照を移動し、それを返すというあなたの考えは、通常行うことです。 –