Tôi đang gặp lỗi thất bại khi sử dụng instance_double.Rspec's instance_double tạo các lỗi thất bại liên tục
Tôi có tệp có 4 thông số kỹ thuật trong đó. Đây là nguồn:
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
Đây là ứng dụng Rails 4.1.4. Bên trong, SubmitPost đặt submitted_at và các cuộc gọi được lưu trên Bài đăng đã được gửi qua. Mô hình Đăng của tôi trông giống như sau:
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
Đó là siêu vani.
Khi tôi chạy rake
, rspec
hoặc bin/rspec
, tôi nhận được tất cả bốn thử nghiệm không bị 20% - 30% thời gian. Các thông báo lỗi luôn luôn là:
Failure/Error: allow(@post).to receive(:submitted_at=)
Post does not implement: submitted_at=
Nếu tôi đặt tên một trong những thông số kỹ thuật với focus: true
, rằng một spec sẽ thất bại 100% thời gian.
Nếu tôi thay thế instance_double
bằng double
, tất cả thông số kỹ thuật sẽ thành công 100% thời gian.
Có vẻ như instance_double đang gặp khó khăn khi phỏng đoán các phương thức có sẵn trên lớp Post. Nó cũng có vẻ hơi ngẫu nhiên và dựa trên thời gian.
Có ai gặp sự cố này không? Bất cứ ý tưởng những gì có thể là sai? Bất kỳ ý thức làm thế nào để đi về xử lý sự cố này? Đương nhiên, chèn một điểm ngắt gỡ lỗi làm cho các thông số kỹ thuật vượt qua 100% thời gian.
Tôi có thêm một số dữ liệu về điều này. Gốc của vấn đề là môi trường Rails không được tải khi spec này chạy. Nếu tôi chỉ chạy tập tin này, nó luôn thất bại. Tôi có tổng cộng bốn tệp spec. Nếu tập tin này chạy đầu tiên, nó không thành công. Nếu cái gì khác chạy trước, nó thành công. Giả định của tôi là chạy trước đó đang tải môi trường Rails, do đó, kiểm tra này sẽ trôi qua. Tệp kiểm tra này nằm trong 'spec/interactors', do đó có thể góp phần vào vấn đề này. – EricM
Dữ liệu khác. Tôi đã xác minh rằng ứng dụng/tương tác, trong đó SubmitPost sống, nằm trong eager_load_paths. Tôi cũng đã thử gắn thẻ thông số với loại:: feature. Thông báo lỗi không thay đổi. – EricM