RSpec:before(:all)和before(:each)之间的深层差异

gmi*_*ile 7 rspec

好的,所以我遇到了一个非常奇怪的问题,直接与之前的块连接.我正在通过Watir和RSpec进行集成测试.对于检查用户是否可以执行登录的简单测试,我通过factory_girl在数据库中创建"用户"记录.

所以我把以下代码:

before(:each) do
  @user = Factory(:user)
end

if "should perform a login" do
  # do stuff
end
Run Code Online (Sandbox Code Playgroud)

do stuff我调用浏览器,看看用户如何尝试登录.不幸的是,他不能这样做 - "用户名无效".

经过一番调查后,我发现如果我把用于创建用户的代码放在before(:all)块中,一切都神奇地起作用.怎么样?在这种情况下:all和之间的区别是什么:each?此外,如果我将用于创建用户的代码实际放在测试体中,它仍然不起作用(即用户不知何故没有添加到数据库或其他东西).

tri*_*ine 3

您可能启用了事务固定装置,因此您的 Watir 进程看不到每个 RSpec 示例所包装的事务内的数据库更改。

尝试禁用事务功能并使用数据库清理器之类的东西来在每个示例之前获得干净的状态。