不确定为什么在改变之前打破这个测试

时间:2013-05-29 07:07:38

标签: ruby-on-rails rspec2 rspec-rails

通过练习Rails教程第10章的练习,该教程涉及测试微帖的分页,我无法弄清楚当我使用before(:all)after(:all)进行测试时,为什么我的测试会中断。即使只是将其更改为before(:each),它也可以,因此它不是实例变量。 (虽然我也可以让它不使用实例,并构建user提供的let

我只是想以正确的方式做到这一点。这样做一次(即:all)似乎是正确的。我错过了什么?

我已经尝试了stop_and_open_page - 当我使用:all时它没有显示微博,只有其他方式(:each)。但是,通过在控制台中检查我的实例变量或user(当使用letbinding.pry的方式尝试)时,它始终具有微博,即使我指定了:all

我认为在使用:all时没有加载关联是有意义的,但是我想不出一个原因,因为它在示例站点和未使用时的测试中起作用{ {1}}。

有什么想法吗?

P.S。我有一个附带问题 - 我在我的:all模型中设置了关系User,但是当我使用下面的实例变量方法进行这些测试时,我必须明确调用has_many :microposts, dependent: :destroy在微型帖子上,否则它们在运行后保留在测试数据库中(即使用户被删除)。我是否遗漏了一些明显的东西,或者当用户是通过Factory Girl创建时级联破坏不起作用?

更新:感谢@Jesper,我发现了after(:all)没有删除相关微博的原因。代码已更新以反映该内容。

delete_all

1 个答案:

答案 0 :(得分:0)

Capybara重置每个示例运行之间的会话,请参阅此答案:https://stackoverflow.com/a/9789326/648392

最有可能的是,您的模型已按预期设置,但测试失败,因为会话已重置。

换句话说,您可以在before(:all)块中设置规范中所需的任何模型,但您必须将与会话相关的内容(例如valid_sessionvisit root_path)移动到before(:each)阻止。