次の rspec テストがあり、その中に api メソッドをスタブしようとしています。FactoryGirl の trait 内にスタブを定義し、after(:build) コールバックを使用します。
describe '#get_json_from_api' do
let(:output_file) { video_file.json_path }
context "when api works" do
around(:each) do |rspec_test|
File.delete(output_file) if File.exists?(output_file)
rspec_test.run
File.delete(output_file) if File.exists?(output_file)
end
let!(:searched_video_file) {
create(:video_file, :stub_api)
video_file.get_json_from_api
video_file
}
it { expect(File.size?(output_file)).to be > 0 }
end
end
ここに工場があります:
factory :video_file do
trait :stub_api do
after(:build) do |vf|
vf.stub(:get_json_from_api){
puts "i am callled!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
File.open(vf.json_path, "w") do |f|
f.write ["some data","more data"].to_json
end
}
end
end
end
スタブは発生せず、rspec テストは失敗します。ただし、特性を削除して単純に残すと、すべてが必要に応じて機能します。
factory :video_file do
after(:build) do |vf|
vf.stub(:get_json_from_api){
puts "i am callled!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
File.open(vf.json_path, "w") do |f|
f.write ["some data","more data"].to_json
end
}
end
end