factory_girl记录在哪里?

时间:2010-03-25 20:22:35

标签: ruby-on-rails database integration-testing factory-bot

我正在尝试通过 Watir RSpec 执行集成测试。因此,我在/ 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错误。

我已经开始调查,并做了一个小技巧。首先,我开始怀疑工厂是否真的在DB中创建了用户。因此,在立即致电工厂之后,我只添加了一些puts User.find内容,以发现用户 实际上在DB中。好的,但由于用户仍然无法登录,我决定亲眼看看他是否出现在DB中。

我在工厂调用后立即添加了sleep,然后查看数据库中的内容。我被压碎看到用户实际上在那里失踪了!怎么会?但是,当我尝试在代码中输出用户时,他实际上是从某个地方获取的。 那么,在运行时中由factory_girl创建的记录在哪里?test还是dev数据库?我不明白。

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

我正在使用 authlogic ,如果可以提供任何线索(不,将database.yml置于此处不起作用。)

3 个答案:

答案 0 :(得分:4)

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

如果您想确保工厂女孩实际创建用户记录,您可以执行以下操作:

before(:each)
  @user = Factory(:user)
  User.find_by_username(@user.username).should_not be_nil
  @browser = FireWatir::Firefox.new
end

答案 1 :(得分:2)

不知怎的,解决方案变得很奇怪 - 我把工厂放到了(所有)块之前,所有的东西都按原样运行。

答案 2 :(得分:-1)

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