2016-04-19 24 views
0

私がテストしようとしている方法では、このようなコードがあります:私は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 
     )) 

これはコーシャーですか?

+1

いいえ、ローカルをスタブすることはできません。メソッドにスタブする必要がある参照を移動し、それを返すというあなたの考えは、通常行うことです。 –

答えて

-1

これはすべてコントローラー内で行われていると仮定して、@controller変数を使用したいと思います。

let(:user_activation_service_instance) { UserActivationService.new(subscription.user, cookies: cookies) } 
allow(@controller).to receive(:service) { user_activation_service_instance } 
+0

ですが、サービスは古いコードのローカル変数です – Jwan622

関連する問題