Bạn muốn sử dụng expect ... change
để xác minh rằng một đặc biệt thay đổi phương pháp gọi - hoặc không thay đổi - một số giá trị khác. Trong trường hợp này:
expect { click_button "Create my account" }.not_to change(User, :count)
sẽ gây rspec phải làm như sau:
- Run
User.count
và lưu ý các giá trị trả về. (Điều này có thể được chỉ định làm người nhận và tên phương thức, chẳng hạn như (User, :count)
trong ví dụ của bạn hoặc dưới dạng một khối mã tùy ý, như { User.count }
.
- Chạy
click_button "Create my account"
là phương pháp Capybara mô phỏng nhấp chuột vào một liên kết. ..
- Run
User.count
lại
- Hãy so sánh các kết quả của # 1 và # 3 Nếu chúng khác nhau, ví dụ thất bại Nếu họ giống nhau, nó đi
các cách khác để sử dụng expect ... change
:..
expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)
Một số tài liệu là here.
Làm thế nào nó thực hiện điều này là một chút phức tạp và không cần thiết phải hiểu cách hoạt động của nó để sử dụng nó. Một cuộc gọi đến expect
là xác định cấu trúc cho rspec thực thi, sử dụng DSL tùy chỉnh của riêng rspec và hệ thống "đối sánh". Gary Bernhardt có screencast khá gọn gàng, trong đó ông cho rằng bí ẩn của rspec thực sự rơi ra một cách tự nhiên từ một ngôn ngữ năng động như ruby.Nó không phải là một giới thiệu tốt để sử dụng rspec, nhưng nếu bạn tò mò về cách tất cả hoạt động, bạn có thể thấy nó thú vị.
CẬP NHẬT
Sau khi nhìn thấy bình luận của bạn về câu trả lời khác, tôi sẽ thêm một chút thông tin về thứ tự của các hoạt động. Bí quyết không trực quan là nó là matcher (change
trong trường hợp này) thực thi tất cả các khối. expect
có một lambda, not_to
là bí danh cho should_not
có công việc là chuyển lambda vào trình ghép. Trình phù hợp trong trường hợp này là change
mà biết để thực hiện đối số riêng của nó một lần, sau đó thực thi lambda mà nó đã được chuyển (một từ expect
), sau đó chạy lại đối số của chính nó để xem mọi thứ có thay đổi không. Đó là khó khăn bởi vì dòng có vẻ như nó nên thực hiện trái sang phải, nhưng vì hầu hết các mảnh chỉ là đi qua các khối mã, họ có thể và trộn chúng vào bất cứ thứ tự nào có ý nghĩa nhất với matcher.
Tôi không phải là chuyên gia về nội dung rspec, nhưng đó là sự hiểu biết của tôi về ý tưởng cơ bản.
Nguồn
2012-05-18 01:55:41
Đây không phải là Capybara, đó là RSpec. –
@RyanBigg Cảm ơn, chỉ cần sửa chữa nó. – Bedasso