Change matcher в 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

И така... WTF?

Промяната на остатък за себе си прави ли твърдението неуспешно? Проверих дали са еднакви остатъци с ==, ===, eq? и винаги е вярно. Не мога да разбера какво не е наред с това.

Използвам rspec 1.3 (това е приложение за rails 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 = Остатък.нов; поставя (r == 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