factory_girl 的记录在哪里?

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

...

当我开始测试并在浏览器中看到“性能”时,它总是会引发“用户名无效”的错误。
我进行了调查,并进行了一个小技巧。首先,我开始怀疑工厂是否实际上在数据库中创建用户。因此,在立即调用工厂后,我放置了一些puts User.find的东西,只是发现用户实际上已经在数据库中了。好的,但是因为用户仍然无法登录,所以我决定亲眼看看他是否存在于数据库中。
我在工厂调用之后添加了一个sleep,然后去看看此时数据库中有什么。我很失望地发现用户实际上确实缺失了!怎么回事?但是,当我尝试从代码中输出用户时,他实际上被从某个地方获取到了。那么由factory_girl在运行时创建的记录位于何处?是test还是dev数据库?我不明白。
我已经检查了10次,确保我正在以test模式运行Mongrel(这重要吗?我认为它很重要,因为我正在尝试运行集成测试),并且我的database.yml包含正确的连接特定数据。
如果可以提供任何线索,我正在使用authlogic(不,这里放置activate_authlogic不起作用)。

你使用 Factory Girl 生成的用户已经被激活了,或者类似这样的情况? - shingara
@shingara 在我调用工厂的那一刻,构造函数 User 正在被建立并应用于数据库。 - oldhomemovie
可以,但是在控制器连接时,它可以通过电子邮件检查您的激活情况。 - shingara
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

非常感谢,感谢解决了我两个小时的搜索,让我的JS测试能够运行。 - Ash Blue

2

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


2
看看jbpros的答案 - 这是因为测试中有事务,并且不同的DB连接无法查看彼此的事务。 before(:all)在每个测试周围的事务之外。 - Martin T.

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接