Как проверить обратные вызовы ActiveRecord с помощью RSpec? - PullRequest
15 голосов
/ 20 апреля 2010

Как проверить следующий пример?

class Post < ActiveRecord::Base
  belongs_to :discussion, touch: true
end

Ответы [ 3 ]

15 голосов
/ 21 апреля 2010

Вы можете установить ожидание сообщения :

it "should touch the discussion" do
  post = Factory.build(:post)
  post.discussion.should_receive(:touch)
  post.save!
end

В этом примере используется Factory Girl , но вы также можете использовать светильники или макеты.

9 голосов
/ 11 декабря 2014

Во-первых

Если все, что вы пытаетесь сделать, это утверждать, что для вашей ассоциации установлена ​​опция touch: true, то вы можете просто сделать следующее:

describe Post do
  it { should belong_to(:discussion).touch(true) }
end

Во-вторых

Для тестирования обратных вызовов в целом, читайте дальше.

Все остальные ответы здесь имеют два недостатка:

  1. Они требуют попадания в базу данных, что может быть медленным.

  2. Они не определяют , какой обратный вызов вызывается во время save!

Вместо этого используйте Маттеры обратного вызова Ifa , который не требует обращения к базе данных, и вы можете указать, какой обратный вызов вы проверяете на наличие.

Установка

Установка Маттеров обратного вызова Следует в с Bundler:

group :test do
  gem "shoulda-callback-matchers", "~> 1.0"
end

Использование

it { should callback(:some_method).after(:save) }

Спасибо Удар за написание этой замечательной библиотеки.

1 голос
/ 20 апреля 2010

Вы можете смоделировать вызов #touch или проверить влияние вашего обратного вызова на него.

it "should touch the discussion" do
  original_updated_at = @discussion.updated_at
  @post.save!
  @post.discussion.updated_at.should_not_be == original_updated_at
end
...