Сопоставитель изменений в Rspec 1.3 не распознает одинаковые объекты

У меня есть этот тест rspec

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

Итак... ВТФ?

Замена остатка на себя делает утверждение неверным? Я проверил, совпадают ли они с ==, ===, eq? это всегда правда. Я не могу понять, что с этим не так.

Я использую rspec 1.3 (это приложение для рельсов 2.3, я не могу перейти на rspec2)


person miguel.camba    schedule 22.05.2012    source источник


Ответы (1)


У RSpec нет проблем с объектами, которые равны. Проблема здесь в том, что в ActiveRecord две несохраненные модели не считаются равными, даже если у них все одинаковые свойства. Вы можете увидеть это, если запустите puts (Residue.new == Residue.new).

Вам нужно будет сохранить объект Residue, чтобы это работало.

person David Chelimsky    schedule 22.05.2012
comment
Но let(:residue) { Residue.new } должен запоминать остаток, поэтому он всегда должен быть одним и тем же экземпляром. r = Остаток.новый; ставит (г == г); #=› правда - person miguel.camba; 22.05.2012
comment
ОК, я понимаю, что здесь происходит — сопоставитель change разработан специально для чисел. Пример не работает в строке github.com/ dchelimsky/rspec/blob/master/lib/spec/matchers/, даже если вы не получите очень хорошего сообщения об ошибке. - person David Chelimsky; 22.05.2012
comment
Я бы рекомендовал просто ожидать document.producer_residue.should == residue. - person David Chelimsky; 22.05.2012
comment
В порядке. Большое спасибо! Я понятия не имел, что изменение было для числа. Я использовал его много раз со строками!! Б**к! - person miguel.camba; 22.05.2012