मुझे example_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
यह एक रेल 4.1.4 एप्लिकेशन है। आंतरिक रूप से, सबमिटपोस्ट सबमिट_ट और पास-इन पोस्ट पर कॉल सहेजता है। मेरे पोस्ट मॉडल इस तरह दिखता है:
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% असफल हो जायेगी।
यदि मैं को double
के साथ प्रतिस्थापित करता हूं, तो सभी चश्मे 100% सफल होंगे।
ऐसा प्रतीत होता है कि example_double को पोस्ट क्लास पर उपलब्ध विधियों का उल्लंघन करने में कुछ कठिनाई हो रही है। यह कुछ हद तक यादृच्छिक और समय-आधारित प्रतीत होता है।
क्या कोई इस मुद्दे में भाग लेता है? कोई अंदाज़ा कि क्या गलत हो सकता है? समस्या निवारण के बारे में कैसे जाना है इसका कोई अर्थ? स्वाभाविक रूप से, एक डिबगिंग ब्रेकपॉइंट डालने से चश्मा 100% गुजरता है।
मेरे पास इस पर कुछ और डेटा है। इस मुद्दे की जड़ यह है कि इस spec चलाते समय रेल पर्यावरण लोड नहीं किया जा रहा है। अगर मैं सिर्फ यह फ़ाइल चलाता हूं, तो यह हमेशा विफल रहता है। मेरे पास कुल चार spec फ़ाइलें हैं I अगर यह फ़ाइल पहले चलती है, तो यह विफल हो जाती है। अगर कुछ और पहले चलता है, तो यह सफल होता है। मेरी धारणा यह है कि पहले की दौड़ रेल पर्यावरण को लोड कर रही है, इसलिए यह परीक्षण गुजरता है। यह परीक्षण फ़ाइल 'spec/interactors' में स्थित है, ताकि समस्या में योगदान हो। – EricM
अधिक डेटा। मैंने सत्यापित किया कि ऐप/इंटरैक्टर्स, जहां सबमिटपोस्ट रहता है, eager_load_paths में है। मैंने spec को टैग के साथ टैगिंग करने का भी प्रयास किया:: सुविधा। त्रुटि संदेश अपरिवर्तित है। – EricM