2017-01-31 15 views
2

以下のケースで何をテストするのか、またそれを行う方法を理解する上で問題があります。外部APIを呼び出すモデルインスタンスメソッドをテストする方法

私はアドレスが有効であれば、基本的に呼び出され、その方法は、サードパーティのAPIをフックし、小切手を作成し、更新するアドレスモデル

validate :address, on: [:create, :update] 

def address 
    check = CalendarEventLocationParsingWorker.new.perform("", self.structured, true) 
    if check[:code] != 0 
     errors.add(:base,"#{self.kind.capitalize} Address couldn't be analysed, please fill up as much fields as possible.") 
    else 
     self.lat = check[:coords]["lat"] 
     self.lon = check[:coords]["lng"] 
    end 
    end 

で次のインスタンスメソッドを持っています。サードパーティのAPIを実際に呼び出すことなく、これを単独でテストすることはできますが、応答をシミュレートするにはどうすればよいですか?

モックとスタブについて読んだことがありますが、私はそれらをまだ手に入れていません。どんな洞察も歓迎です。 Rspecを使用して、マッチャーと工場の女の子。

webmockで

に例を外部API応答をスタブに

答えて

1

使用webmockvcr宝石:

stub_request(:get, "your external api url") 
    .to_return(code: 0, coords: { lat: 1, lng: 2 }) 

# test your address method here 

一度テストを実行することができますし、それが外部APIへの実際の呼び出しを行いますvcrでは、記録そのファイルは.ymlになり、その後のすべてのテストで再利用されます。外部API応答が変更された場合は、.ymlファイルを削除して、新しいサンプル応答を記録することができます。

+0

をねえ、このためのおかげで実際のリクエストをせずに行うことはできますか一度もない? –

+0

@PetrosKyriakouはい、これにはwebmockを使用してください –

0

あなたは

構文目的の値を返すためにCalendarEventLocationParsingWorkerの任意のインスタンスにperform方法をスタブすることができます

allow_any_instance_of(Class).to receive(:method).and_return(:return_value) 

例:

allow_any_instance_of(CalendarEventLocationParsingWorker).to receive(:perform).and_return({code: 0}) 

参照してください:Allow a message on any instance of a class

関連する問題