Понимание assert_difference в ruby-on-rails

Может кто-нибудь объяснить, что делает этот тестовый код:

assert_difference('Post.count') do
    post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}
end

и...

assert_difference 'ActionMailer::Base.deliveries.size', +1 do
  post :invite_friend, :email => '[email protected]'
end

Я не могу понять это, хотя я прочитал документацию.

Спасибо!

Ответ 1

assert_difference проверяет, что результат вычисления его первого аргумента (String, который может быть передан на eval) изменяется на определенную сумму после вызова блока, который был передан. Первый пример выше может быть "развернут":

before = Post.count # technically, eval("Post.count")
post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}
after = Post.count
assert_equal after, before + 1

Ответ 2

Это просто проверка того, что количество объектов для любого типа было увеличено на 1. (Это простой способ проверить, что объект добавлен в БД)

Ответ 3

Это утверждение состоит в том, чтобы проверить определенную/определенную разницу в первом аргументе. 1-й аргумент должен быть строкой i.e "Post.count". Второй аргумент имеет значение по умолчанию 1, вы можете указать и другие числа, даже непеременные числа. для более подробной информации посетите: http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html

Ответ 4

Этот метод должен проверить, существует ли численная разница между первым аргументом и вторым аргументом. В большинстве случаев первый аргумент представляет собой строку, которая похожа на "Post.count", а второй аргумент - это блок. В рельсах это чаще всего используется в функциональном тестировании, чтобы проверить, можно ли сохранить объект в базе данных. Логика заключается в том, что до того, как новый объект будет сохранен, количество записей в этой конкретной таблице должно отличаться от количества записей после сохранения объекта (от 1 до более точного).