Tôi muốn kiểm tra nhiều thay đổi trong mô hình khi gửi biểu mẫu trong thông số tính năng. Ví dụ: tôi muốn đảm bảo rằng tên người dùng đã được thay đổi từ X thành Y và mật khẩu được mã hóa đã được thay đổi theo bất kỳ giá trị nào.
Tôi biết có một số câu hỏi về điều đó, nhưng tôi không tìm thấy câu trả lời phù hợp cho mình. Câu trả lời chính xác nhất có vẻ giống như câu trả lời ChangeMultiple
của Michael Johnston ở đây: Liệu RSpec có thể mong đợi sự thay đổi trong hai bảng không? . Nhược điểm của nó là chỉ kiểm tra các thay đổi rõ ràng từ các giá trị đã biết sang các giá trị đã biết.
Tôi đã tạo một số mã giả về cách tôi nghĩ rằng một trình đối sánh tốt hơn có thể trông như thế nào:
expect {
click_button 'Save'
}.to change_multiple { @user.reload }.with_expectations(
name: {from: 'donald', to: 'gustav'},
updated_at: {by: 4},
great_field: {by_at_leaset: 23},
encrypted_password: true, # Must change
created_at: false, # Must not change
some_other_field: nil # Doesn't matter, but want to denote here that this field exists
)
Tôi cũng đã tạo khung cơ bản của trình ChangeMultiple
khớp như thế này:
module RSpec
module Matchers
def change_multiple(receiver=nil, message=nil, &block)
BuiltIn::ChangeMultiple.new(receiver, message, &block)
end
module BuiltIn
class ChangeMultiple < Change
def with_expectations(expectations)
# What to do here? How do I add the expectations passed as argument?
end
end
end
end
end
Nhưng bây giờ tôi đã gặp lỗi này:
Failure/Error: expect {
You must pass an argument rather than a block to use the provided matcher (nil), or the matcher must implement `supports_block_expectations?`.
# ./spec/features/user/registration/edit_spec.rb:20:in `block (2 levels) in <top (required)>'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
# /Users/josh/.rvm/gems/ruby-2.1.0@base/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
Bất kỳ trợ giúp nào trong việc tạo đối sánh tùy chỉnh này đều được đánh giá cao.
.and change { @something }.by(0)