Rspec 3 फ़्लैश संदेशों का परीक्षण कैसे करें


81

मैं नियंत्रक की कार्रवाई और rspec के साथ फ्लैश संदेश उपस्थिति का परीक्षण करना चाहता हूं।

कार्रवाई :

def create
  user = Users::User.find_by_email(params[:email])
  if user
    user.send_reset_password_instructions
    flash[:success] = "Reset password instructions have been sent to #{user.email}."
  else
    flash[:alert] = "Can't find user with this email: #{params[:email]}"
  end

  redirect_to root_path
end

कल्पना :

describe "#create" do
  it "sends reset password instructions if user exists" do
    post :create, email: "email@example.com"      
    expect(response).to redirect_to(root_path)
    expect(flash[:success]).to be_present
  end
...

लेकिन मुझे एक त्रुटि मिली है:

Failure/Error: expect(flash[:success]).to be_present
   expected `nil.present?` to return true, got false

जवाबों:


67

आप की उपस्थिति के लिए परीक्षण कर रहे हैं flash[:success], लेकिन आपके नियंत्रक में आप उपयोग कर रहे हैंflash[:notice]


ओह, माफ करना, मैं यहाँ फिसल गया। फ्लैश के साथ एक ही त्रुटि [: नोटिस]
माइक एंड्रियानोव

3
उस स्थिति में, समस्या संभवतः आपके नियंत्रक कोड और / या परीक्षण डेटा के साथ है। बदलने की कोशिश expect(flash[:notice])करने के लिए expect(flash[:alert])है, और अगर परीक्षण तो गुजरता है शायद यह है कि अभी परीक्षण ईमेल मौजूद नहीं है।
रबसमर

48

फ्लैश मैसेज का परीक्षण करने का सबसे अच्छा तरीका कंधा रत्न द्वारा प्रदान किया गया है ।

यहाँ तीन उदाहरण हैं:

expect(controller).to set_flash
expect(controller).to set_flash[:success]
expect(controller).to set_flash[:alert].to(/are not valid/).now

34

यदि आप फ़्लैश संदेशों की सामग्री में अधिक रुचि रखते हैं, तो आप इसका उपयोग कर सकते हैं:

expect(flash[:success]).to match(/Reset password instructions have been sent to .*/)

या

expect(flash[:alert]).to match(/Can't find user with this email: .*/)

मैं एक विशिष्ट संदेश के लिए जाँच करने की सलाह दूंगा जब तक कि वह संदेश महत्वपूर्ण न हो और / या वह अक्सर परिवर्तित न हो।


5

साथ में: gem 'shoulda-matchers', '~> 3.1'

.nowपर सीधे बुलाया जाना चाहिए set_flash

का उपयोग set_flashके साथ nowक्वालीफायर और निर्दिष्ट करने nowअन्य क्वालिफायर के बाद अब अनुमति दी है।

आप इसके nowतुरंत बाद उपयोग करना चाहेंगे set_flash। उदाहरण के लिए:

# Valid
should set_flash.now[:foo]
should set_flash.now[:foo].to('bar')

# Invalid
should set_flash[:foo].now
should set_flash[:foo].to('bar').now

0

एक अन्य दृष्टिकोण इस तथ्य को छोड़ना है कि एक नियंत्रक में फ्लैश संदेश हैं और इसके बजाय एकीकरण परीक्षण लिखना है। इस तरह से आप उन अवसरों को बढ़ाते हैं, जिन्हें आपको जावास्क्रिप्ट या किसी अन्य तरीके से उस संदेश को दिखाने का निर्णय लेने के बाद परीक्षण को बदलने की आवश्यकता नहीं होगी।

यह भी देखें https://stackoverflow.com/a/13897912/2987689

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.