2014-07-23 12 views
52

Tôi muốn kiểm tra hành động của bộ điều khiển và thông báo flash hiện diện với rspec.Rspec 3 cách kiểm tra thông báo flash

hành động:

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 

đặc tả:

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

Nhưng tôi đã có một lỗi:

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

Trả lời

48

Bạn đang thử nghiệm cho sự hiện diện của flash[:success], nhưng trong c của bạn ontroller bạn đang sử dụng flash[:notice]

+0

Ồ, xin lỗi, tôi vừa bị trượt ở đây. Lỗi tương tự với flash [: notice] – MikeAndr

+2

Trong trường hợp đó, sự cố có thể xảy ra với mã điều khiển và/hoặc dữ liệu thử nghiệm của bạn. Cố gắng thay đổi 'mong đợi (flash [: thông báo])' thành 'mong đợi (flash [: alert])', và nếu kiểm tra vượt qua thì có lẽ nó chỉ là email kiểm tra không tồn tại. – rabusmar

32

Cách tốt nhất để kiểm tra tin nhắn flash được cung cấp bởi đá quý shoulda.

Dưới đây là ba ví dụ:

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

Tuyệt vời, không biết điều này! :) – Loed

14

Nếu bạn đang quan tâm nhiều hơn trong nội dung của các tin nhắn flash bạn có thể sử dụng này:

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

hoặc

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

tôi sẽ tư vấn chống lại việc kiểm tra tin nhắn cụ thể trừ khi thông điệp đó là rất quan trọng và/hoặc nó không thay đổi thường xuyên.

0

Cách tiếp cận khác là bỏ qua thực tế là bộ điều khiển có thông báo flash và viết bài kiểm tra tích hợp thay thế. Bằng cách này, bạn tăng cơ hội mà bạn sẽ không cần phải thay đổi bài kiểm tra khi bạn quyết định hiển thị thông báo đó bằng JavaScript hoặc bằng cách khác.

cũng https://stackoverflow.com/a/13897912/2987689

0

Xem With: gem 'shoulda-matchers', '~> 3.1'

Các .now nên được gọi là trực tiếp trên set_flash.

Sử dụng set_flash với vòng loại now và chỉ định now sau khi vòng loại khác không còn được phép.

Bạn sẽ muốn sử dụng now ngay sau set_flash. Ví dụ:

# 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 
Các vấn đề liên quan