Bir özellik spesifikasyonunda bir form gönderirken modeldeki birçok değişikliği kontrol etmek istiyorum. Örneğin, kullanıcı adının X'ten Y'ye değiştirildiğinden ve şifrelenmiş parolanın herhangi bir değerle değiştirildiğinden emin olmak istiyorum.
Bununla ilgili bazı sorular olduğunu biliyorum, ama benim için uygun bir cevap bulamadım. En doğru cevap ChangeMultiple
, Michael Johnston'un eşleştiricisine benziyor burada: RSpec'in iki tabloda değişiklik beklemesi mümkün mü? . Bunun dezavantajı, yalnızca bilinen değerlerden bilinen değerlere açık değişiklikleri kontrol etmesidir.
Daha iyi bir eşleştiricinin nasıl görünebileceğine dair bazı sözde kodlar oluşturdum:
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
)
ChangeMultiple
Eşleştiricinin temel iskeletini de şu şekilde oluşturdum :
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
Ama şimdi zaten bu hatayı alıyorum:
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'
Bu özel eşleştiriciyi oluştururken herhangi bir yardım çok takdir edilmektedir.
.and change { @something }.by(0)