기능 사양에서 양식을 제출할 때 모델의 많은 변경 사항을 확인하고 싶습니다. 예를 들어 사용자 이름이 X에서 Y로 변경되었고 암호화 된 암호가 임의의 값으로 변경되었는지 확인하고 싶습니다.
이미 그것에 대한 몇 가지 질문이 있다는 것을 알고 있지만 나에게 적합한 답을 찾지 못했습니다. 가장 정확한 대답은 ChangeMultiple
Michael Johnston 의 matcher 처럼 보입니다 . RSpec이 두 테이블에서 변경을 예상 할 수 있습니까? . 단점은 알려진 값에서 알려진 값으로의 명시적인 변경 사항 만 확인한다는 것입니다.
더 나은 일치자가 어떻게 보일 수 있다고 생각하는지에 대한 의사 코드를 만들었습니다.
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
다음과 같이 matcher 의 기본 골격을 만들었습니다 .
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
하지만 이제 이미이 오류가 발생합니다.
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'
이 맞춤 매처를 만드는 데 도움을 주시면 대단히 감사하겠습니다.
.and change { @something }.by(0)