之前(:all)不应只执行一次吗?在我的示例中,底部测试失败,因为db记录包含旧数据(名称==“ John”)。为什么这样?我在测试上方将其更改为“ Irow”。
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
结束
答案 0 :(得分:1)
此答案假设您的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)
(也许对某些真正昂贵的操作而言)。