Использование лямбда для проверки обратных вызовов в рельсах?

У меня есть лента новостей на основе redis, в которую вставляются элементы с помощью обратных вызовов, когда происходят определенные события. Например, когда пользователь делает заметку о книге, она вставляется в новостные ленты читателей книги.

class Note < ActiveRecord::Base
  after_save do |note|
    notify_the note.book.readers
  end

...
end

Теперь это нормально, и я на 99% уверен, что это работает, так как я могу посмотреть свою ленту и увидеть там заметки. Моя проблема заключается в тестировании на Rails 3 с последней версией rspec-rails.

По какой-то причине это проходит:

spec/models/note_spec.rb
describe "note creation" do
  it "should notify the readers of the book the note is on" do
    @user.feed.count.should == 0
    @note.save!
    @user.feed.count.should == 1
  end
end

Но это не так:

spec/models/note_spec.rb
describe "note creation" do
  it "should notify the readers of the book the note is on" do
    lambda do
      @note.save!
    end.should change(@user.feed, :count).by(1)
  end
end

а я не могу понять в чем разница?


person David Tuite    schedule 15.04.2011    source источник
comment
Единственное, о чем я могу думать, это то, что @note.save! генерирует исключение, и оно не всплывает, потому что оно изолировано в лямбде. Но если @note во втором тесте будет точно таким же, как и в первом тесте, это маловероятно.   -  person Robert Speicher    schedule 15.04.2011
comment
Да они точно одинаковые.   -  person David Tuite    schedule 16.04.2011
comment
Я бы следил за журналом тестов и запускал два теста, чтобы увидеть, что на самом деле выполняется. Должно быть что-то другое.   -  person Paul Sturgess    schedule 16.04.2011


Ответы (2)


RSpec не поддерживает синтаксис do/end для этого сопоставителя. См. предупреждение внизу этой страницы... http://apidock.com/rspec/Spec/Matchers/change

person Paul Sturgess    schedule 15.04.2011
comment
Извините, это моя собственная ошибка, но я должен был сказать, что использую rpec2 (который, на самом деле, поддерживает синтаксис do.. end для лямбда. Я все равно пробовал его с фигурными скобками, и, похоже, это не решило проблему. Я пытался ожидать { }.to, и это не удается. - person David Tuite; 16.04.2011
comment
Глядя на код, кажется, что RSpec 2 не поддерживает do...end. См. в lib/spec/matchers/change.rb - person zetetic; 18.04.2011

Чтобы использовать лямбда-выражение и проверить наличие изменений, вам нужно использовать фигурные скобки {} — синтаксис do/end не поддерживается (пока).

person Trent Scott    schedule 15.04.2011