Ich möchte beim Senden eines Formulars in einer Feature-Spezifikation nach vielen Änderungen in einem Modell suchen. Ich möchte beispielsweise sicherstellen, dass der Benutzername von X in Y geändert wurde und dass das verschlüsselte Kennwort um einen beliebigen Wert geändert wurde.
Ich weiß, dass es dazu bereits einige Fragen gibt, aber ich habe keine passende Antwort für mich gefunden. Die genaueste Antwort scheint hier der ChangeMultiple
Matcher von Michael Johnston zu sein: Kann RSpec Änderungen in zwei Tabellen erwarten? . Sein Nachteil ist, dass man nur nach expliziten Änderungen von bekannten Werten zu bekannten Werten sucht.
Ich habe einen Pseudocode erstellt, wie ein besserer Matcher aussehen könnte:
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
)
Ich habe auch das Grundgerüst des ChangeMultiple
Matchers wie folgt erstellt:
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
Aber jetzt bekomme ich schon diesen Fehler:
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'
Jede Hilfe bei der Erstellung dieses benutzerdefinierten Matchers wird sehr geschätzt.
.and change { @something }.by(0)