Я получаю периодические сбои теста при использовании 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. Внутри SubmitPost устанавливает submit_at и вызывает save для переданного сообщения. Моя модель Post выглядит так:
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
, эта спецификация не сработает в 100% случаев.
Если я заменю instance_double
на double
, все спецификации будут успешными в 100% случаев.
Похоже, что instance_double испытывает некоторые трудности с выводом методов, доступных в классе Post. Это также кажется несколько случайным и основанным на времени.
Кто-нибудь сталкивался с этой проблемой? Любые идеи, что может быть не так? Есть смысл, как решить эту проблему? Естественно, вставка точки останова отладки приводит к тому, что спецификации выполняются в 100% случаев.
spec/interactors
, так что это может способствовать возникновению проблемы. - person EricM   schedule 10.09.2014