サンプル間で rspec-mocks の double を共有する方法について質問があります。rspec-mocks を使用して新しい Rails アプリを作成してい3.1.3
ます。私は古い (< 2.14) を使用することに慣れており、現在の rspec の使用法について知識を更新しようとしています。
私はモデルメソッドを持っています:
def self.from_strava(activity_id, race_id, user)
@client ||= Strava::Api::V3::Client.new(access_token: 'abc123')
activity = @client.retrieve_an_activity(activity_id)
result_details = {race_id: race_id, user: user}
result_details[:duration] = activity['moving_time']
result_details[:date] = Date.parse(activity['start_date'])
result_details[:comment] = activity['description']
result_details[:strava_url] = "http://www.strava.com/activities/#{activity_id}"
Result.create!(result_details)
end
そして、ここに仕様があります:
describe ".from_strava" do
let(:user) { FactoryGirl.build(:user) }
let(:client) { double(:client) }
let(:json_response) { JSON.parse(File.read('spec/support/strava_response.json')) }
before(:each) do
allow(Strava::Api::V3::Client).to receive(:new) { client }
allow(client).to receive(:retrieve_an_activity) { json_response }
allow(Result).to receive(:create!)
end
it "sets the duration" do
expect(Result).to receive(:create!).with(hash_including(duration: 3635))
Result.from_strava('123', 456, user)
end
it "sets the date" do
expect(Result).to receive(:create!).with(hash_including(date: Date.parse("2014-11-14")))
Result.from_strava('123', 456, user)
end
end
単一のテストを単独で実行すると問題describe ".from_strava"
ありませんが、ブロック全体を実行すると、メッセージで失敗します
Double :client was originally created in one example but has leaked into another example and can no longer be used. rspec-mocks' doubles are designed to only last for one example, and you need to create a new one in each example you wish to use it for.
言いたいことはわかるが、確かにこれはdouble
2 つの例で使用されている a の適切な使用法です。結局のところ、client
double は例にとって重要ではありません。WebMock を使用できると思いますが、それは非常に低レベルのようで、実際に記述されたコードにうまく変換されません。結局のところ、例ごとに 1 つのことだけを主張する必要があります。
client
double を呼び出しに置き換えることを考えていました
allow(Strava::Api::V3::Client).to receive_message_chain(:new, :retrieve_an_activity) { json_response }
receive_message_chain
しかし、ドキュメンテーションがコードの匂いであるべきだと述べていることを考えると、それも正しいアプローチではないようです 。
したがってreceive_message_chain
、 , shared client
double を使用せず、標準の DRY 原則に従うべきではない場合、どうすればこれを修正できますか?
これについてのフィードバックをお待ちしています。
ありがとう、デイブ