3

我正在尝试通过WatirRSpec执行集成测试。因此,我在 /integration 中创建了一个测试文件并编写了一个测试,它通过factory_girl将测试用户添加到基础中。

问题是——我实际上不能用我的测试用户登录。我写的测试如下:

...

before(:each)
  @user = Factory(:user)
  @browser = FireWatir::Firefox.new
end

it "should login"
  @browser.text_field(:id, "username").set(@user.username)
  @browser.text_field(:id, "password").set(@user.password)
  @browser.button(:id, "get_in").click
end

...

当我开始测试并在浏览器中看到“性能”时,它总是会引发Username is not valid错误。

我已经开始调查,并做了一个小技巧。首先,我开始怀疑工厂是否真的在数据库中创建了用户。因此,在立即致电工厂后,我放了一些puts User.find东西才发现用户实际上在数据库中。好的,但是由于用户仍然无法登录,我决定亲眼看看他是否存在于数据库中。

我在sleep工厂电话后添加了一个权利,然后去查看数据库中的内容。我很震惊地看到用户实际上在那里失踪了!怎么会?尽管如此,当我试图在代码中输出一个用户时,他实际上是从某个地方获取的。那么 factory_girl 在运行时中制作的记录在哪里呢?是数据库test还是dev数据库?我不明白。

我已经检查了 10 次是否在test模式下运行 Mongrel(这有关系吗?我认为确实如此,因为我正在尝试调整集成测试)以及我是否database.yml拥有正确的连接特定数据。

我正在使用authlogic,如果这可以提供任何线索(不,putactivate_authlogic在这里不起作用)。

4

3 回答 3

4

不要忘记 RSpec 在运行规范时可能正在使用转换。RSpec 会将规范的执行包装在事务中并在最后回滚。这意味着您将无法从该事务外部(即从另一个 SQL 连接)查看记录。

如果您想确保用户记录实际上是由 Factory Girl 创建的,您可以执行以下操作:

before(:each)
  @user = Factory(:user)
  User.find_by_username(@user.username).should_not be_nil
  @browser = FireWatir::Firefox.new
end
于 2010-03-27T17:31:39.770 回答
2

不知何故,这个解决方案变得很奇怪——我把工厂放在了 before(:all) 块中,所有的东西都按照它应该的方式工作。

于 2010-03-30T17:59:21.427 回答
-1

Factory Girl 将在您的测试数据库中创建临时数据库条目。您的测试数据库将在每次测试后被清除。

于 2010-03-29T13:15:16.067 回答