Почему модель содержит старые данные в БД после перезагрузки? - PullRequest
0 голосов
/ 11 ноября 2018

Разве раньше (: все) не должно быть выполнено только один раз? В моем примере нижний тест не пройден, потому что запись в базе данных содержит старые данные (name == "John"). Почему так? Я изменил его в тесте над ним на "Irow".

describe "Widget" do
before(:all) do
  @widget = Widget.create(name: "John")
end

it "changes Widget's #name in DB" do
  expect do
    @widget.name = "Irow"
    @widget.save!
  end.to change { @widget.reload.name}.from("John").to("Irow")
end

it "#name must be updated in DB by previous test" do
  expect(@widget.reload.name).to eq("Irow") # failing test
end

конец

1 Ответ

0 голосов
/ 11 ноября 2018

Этот ответ предполагает, что в вашем rails_helper.rb или spec_helper.rb есть строка config.use_transactional_fixtures = true.

То, что делают ваши тесты, - это запуск каждого теста в выделенной транзакции и откат этой транзакции после завершения теста.

Ваш первый тест изменит имя @widget на Irow, пройдет успешно и откатит изменения в базе данных.

Это ставит вас в состояние, когда после этого теста

@widget.name == "Irow"

но

@widget.reload.name == "John"

поскольку транзакция, которая изменила имя на Irow, была откатана, поэтому строка в базе данных снова получила John.

Еще одна вещь, о которой стоит упомянуть, это то, что вы можете запускать свои тесты в случайном порядке (config.order = :random), поэтому ваши тесты будут мигать, если вы не выполняете каждый тест в выделенной транзакции.

Постарайтесь сделать свои тесты как можно более изолированными, используйте before(:all), только если оно действительно имеет смысл (возможно, для некоторых очень дорогих операций).

...