Этот ответ предполагает, что в вашем 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)
, только если оно действительно имеет смысл (возможно, для некоторых очень дорогих операций).