重新加载后,为什么模型在DB中包含旧数据?

时间:2018-11-11 13:26:22

标签: rspec rspec-rails

之前(:all)不应只执行一次吗?在我的示例中,底部测试失败,因为db记录包含旧数据(名称==“ John”)。为什么这样?我在测试上方将其更改为“ Irow”。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

结束

1 个答案:

答案 0 :(得分:1)

此答案假设您的rails_helper.rbspec_helper.rb中有一行config.use_transactional_fixtures = true

您的测试正在做的事情是在专用事务中运行每个测试,并在测试完成后回滚所述事务。

您的第一个测试会将@widget的名称更改为Irow,成功通过并将更改回滚到数据库。

这会使您处于经过此测试的状态

@widget.name == "Irow"

但是

@widget.reload.name == "John"

由于将名称更改为Irow的事务已回滚,因此数据库中的行再次具有John

值得一提的另一件事是,您可能会以随机顺序(config.order = :random)运行测试,因此,如果您没有在专用事务中运行每个测试,则测试将闪烁。

请尝试使测试尽可能孤立,仅在切实可行的情况下使用before(:all)(也许对某些真正昂贵的操作而言)。