Rspec 3 cách kiểm tra tin nhắn flash


81

Tôi muốn kiểm tra hành động của bộ điều khiển và sự hiện diện của tin nhắn flash với rspec.

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 điểm kỹ thuật :

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
...

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

Câu trả lời:


67

Bạn đang kiểm tra sự hiện diện của flash[:success], nhưng trong bộ điều khiển của bạn, bạn đang sử dụngflash[:notice]


Ồ, xin lỗi, tôi chỉ trượt ở đây. Cùng một lỗi với đèn flash [: Thông báo]
Mike Andrianov

3
Trong trường hợp đó, vấn đề có thể là với mã bộ điều khiển và / hoặc dữ liệu thử nghiệm của bạn. Cố gắng thay đổi expect(flash[:notice])thành expect(flash[:alert]), và nếu kiểm tra vượt qua thì có thể chỉ là email kiểm tra không tồn tại.
rabusmar

47

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

34

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

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

hoặc là

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

Tôi khuyên bạn không nên kiểm tra một tin nhắn cụ thể trừ khi tin nhắn đó là quan trọng và / hoặc nó không thay đổi thường xuyên.


5

Với: gem 'shoulda-matchers', '~> 3.1'

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

Việc sử dụng set_flashvới nowvòng loại và chỉ định nowsau các vòng loại khác không còn được phép.

Bạn sẽ muốn sử dụng nowngay 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

0

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

Xem thêm https://stackoverflow.com/a/13897912/2987689

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.