RSpec "count" change.by? - PullRequest
       2

RSpec "count" change.by?

0 голосов
/ 31 мая 2018

Итак, я смотрел на: https://rubyplus.com/articles/1491-Basic-TDD-in-Rails-Writing-Validation-Tests-for-the-Model

Просто видел методы тестирования, и я увидел это:

require 'rails_helper'

describe Article, type: :model do
  it 'is valid if title and description fields have value' do
    expect do
      article = Article.new(title: 'test', description: 'test')
      article.save
    end.to change{Article.count}.by(1)
  end
end

В частности, последняя строка: end.to change{Article.count}.by(1).Из чтения https://relishapp.com/rspec/rspec-expectations/v/3-7/docs/built-in-matchers/change-matcher

В частности, говорится:

Сопоставление изменений используется для указания того, что блок кода изменяет некоторое изменяемое состояние.Вы можете указать, что изменится, используя любую из двух форм:

Что имеет смысл.Но мы тестировали Article.count в блоке кода, который на самом деле ничего не «делает» (article.save - это то, что на самом деле изменило Article.count, так как именно это работает? Тест проверяет, что вблок кода перед его запуском и "предварительный запуск" ... сравнение .by(1) после?

Спасибо

1 Ответ

0 голосов
/ 31 мая 2018

Выполняется два блока кода.Блок кода передан expect, а блок кода передан change.Это то, что действительно происходит в псевдокоде.

difference = 1
initial_count = Article.count

article = Article.new(title: 'test', description: 'test')
article.save

final_count = Article.count

expect(final_count - initial_count).to eq(difference)

Я бы реорганизовал ваш тест, чтобы было немного проще следовать ему:

require 'rails_helper'

describe Article, type: :model do
  let(:create_article) { Article.create(title: 'test', description: 'test') }

  it 'is valid if title and description fields have value' do
    expect { create_article }.to change { Article.count }.by(1)
  end
end
...