instance_double을 사용할 때 간헐적 인 테스트 실패가 발생합니다.간헐적 인 spec failure를 생성하는 Rspec의 instance_double
파일에 4 가지 사양이 있습니다. 여기에 소스가 있습니다 :
require 'rails_helper'
describe SubmitPost do
before(:each) do
@post = instance_double('Post')
allow(@post).to receive(:submitted_at=)
end
context 'on success' do
before(:each) do
allow(@post).to receive(:save).and_return(true)
@result = SubmitPost.call(post: @post)
end
it 'should set the submitted_at date' do
expect(@post).to have_received(:submitted_at=)
end
it 'should call save' do
expect(@post).to have_received(:save)
end
it 'should return success' do
expect(@result.success?).to eq(true)
expect(@result.failure?).to eq(false)
end
end
context 'on failure' do
before(:each) do
allow(@post).to receive(:save).and_return(false)
@result = SubmitPost.call(post: @post)
end
it 'should return failure' do
expect(@result.success?).to eq(false)
expect(@result.failure?).to eq(true)
end
end
end
이것은 Rails 4.1.4 어플리케이션입니다. 내부적으로 SubmitPat은 submit_at를 설정하고 전달 된 Post에 save를 호출합니다. 내 게시물 모델은 다음과 같습니다.
class Post < ActiveRecord::Base
validates :title, presence: true
validates :summary, presence: true
validates :url, presence: true
validates :submitted_at, presence: true
scope :chronological, -> { order('submitted_at desc') }
end
슈퍼 바닐라입니다.
rake
, rspec
또는 bin/rspec
을 실행하면 네 번의 테스트가 모두 20 % - 30 % 실패합니다. 오류 메시지는 항상 :
Failure/Error: allow(@post).to receive(:submitted_at=)
Post does not implement: submitted_at=
내가 focus: true
와 사양 중 하나를 레이블 경우
instance_double
을 double
으로 바꾸면 모든 사양이 100 % 성공합니다.
instance_double은 Post 클래스에서 사용할 수있는 메소드를 추론하는 데 어려움을 겪고있는 것으로 보입니다. 또한 다소 임의적이고 타이밍 기반으로 보입니다.
누구에게이 문제가 발생 했습니까? 어떤 아이디어가 잘못된 것일까 요? 이 문제를 해결하는 방법에 대해 알고 싶습니다. 당연히 디버깅 중단 점을 삽입하면 사양이 100 % 시간을 지납니다.
여기에 대한 데이터가 더 있습니다. 문제의 근본 원인은이 스펙이 실행될 때 Rails 환경이로드되지 않는다는 것입니다. 이 파일 만 실행하면 항상 실패합니다. 총 4 개의 사양 파일이 있습니다. 이 파일이 먼저 실행되면 실패합니다. 다른 것이 먼저 실행되면 성공합니다. 내 가정은 이전 테스트가 Rails 환경을로드 중이므로이 테스트가 통과한다는 것입니다. 이 테스트 파일은'spec/interactors'에 위치하므로 문제가 될 수 있습니다. – EricM
추가 데이터. SubmitPost가있는 app/interactors가 eager_load_paths에 있음을 확인했습니다. 필자는 spec : : feature로 태그를 지정하려고 시도했다. 오류 메시지는 변경되지 않습니다.내가이 문제를 해결 돕는 – EricM