Получавам периодични неуспешни тестове, когато използвам 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 и извиква запазване на предадената публикация. Моят пост модел изглежда така:
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