我正在尝试通过 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
置于此处不起作用。)
答案 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将在您的测试数据库中创建临时数据库条目。每次测试后,您的测试数据库都将被清除。