у меня есть, что RSpec тестИзменение согласовани в Rspec 1.3 не признает равные объекты
let(:document) { Document.new }
let(:residue) { Residue.new }
describe "inner_residue=" do
before do
document.producer_residue = residue
end
it 'dont changes the producer residue' do
expect { document.inner_residue = residue }.to_not change(document, :producer_residue)
end
end
что выводит эту ошибку:
producer_residue should not have changed, but did change from #<Residue id: nil, un_code: nil, description: "res", created_at: ... > to #<Residue id: nil, un_code: nil, description: "res", created_at: ... >
Как вы видите, есть тот же остаток. метод его более сложным, но это один является упрощение, которое не слишком:
def inner_residue=(other)
return self.producer_residue = self.addressee_residue = nil unless other
self.producer_residue = producer_residue
end
Итак ... WTF?
Изменение остатка для себя делает утверждение недействительным? Я проверил, являются ли они одним и тем же остатком с ==, ===, eq? это всегда верно. Я не понимаю, что с этим случилось.
Я использую RSpec 1.3 (Сво рельсы 2.3 приложение, я не могу обновить rspec2)
Но let (: остаток) {Residue.new} должен помнить остаток, поэтому он должен быть всегда одного и того же экземпляра. r = Residue.new; puts (r == r); # => true –
OK - Я вижу, что здесь происходит - матчи 'change' специально разработаны для чисел. В примере не выполняется строка https://github.com/dchelimsky/rspec/blob/master/lib/spec/matchers/change.rb#L21, даже если вы не получили очень хорошее сообщение об ошибке. –
Я бы рекомендовал просто ожидать 'document.producer_residue.should == остаток'. –