2011-07-11 80 views
2

我有一个应用程序,我正在用rspec2(2.6.4),水豚和硒进行测试。autotest和rspec给出不同的答案

当我用rspec直接运行任何请求规范时,测试通过。

当我使用自动测试运行请求规格时,它们都会失败,并显示'无法找到ID = * *的用户。

当自动测试自动重新加载所述第一请求测试,它通过

自动测试然后重新加载所有的测试,并且当它到达请求测试它们都再次失败

用户正在由工厂女孩创建并记录在使用设计如下:

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

after(:each){ 
    logout 
    } 

,并在规范帮手我有

def login(user) 
    post login_path, :login => user.login, :password => 'testing' 
end 

这些是我已经安装了相关的宝石(组:测试)

gem "rspec" 
    gem "rspec-rails" 
    gem "autotest-rails" 
    gem "selenium-webdriver", ">= 0.2.2" 
    gem 'capybara', :git => 'git://github.com/jnicklas/capybara.git' 
    gem 'launchy' 
    gem 'database_cleaner' 

这已经莫名其妙我现在一段时间 - 任何想法的人?甚至有关如何开始查看堆栈跟踪以查看两个调用的区别在哪里的想法?

+0

'autotest'无法加载您的'spec_helper.rb'吗? –

+0

嗯 - 这是一个想法 - 不确定在其他测试中需要什么样的规范助手 - 我会坚持一个调试,并看到...谢谢 – chrispanda

+0

,谢谢你的建议,但遗憾的是,这不是它......但是从我一直在做的调试中可以清楚地看到,问题不在于登录用户,而是在测试中创建用户,所以我开始考虑事务和某些事情使用清洁剂... – chrispanda

回答

2

解决了,有点。这里真正发生的事情仍然是一个谜,但这里是问题真正的真相,以及我是如何解决它的。自动测试不是罪魁祸首 - 问题是在一批中运行所有测试。运行rspec spec/**/*会导致相同的错误。这是一个线索,问题在于在测试之间没有正确地清理数据库。我正在使用设计,所以最终依靠基于机架的身份验证的监狱长。在守望者文档之后,我打电话给Warden.test_reset!在after(:suite)块中。如果我将它移动到after(:all)块中,则无论是作为请求测试单独运行,还是单个运行所有测试,测试都会传递相同的结果。

那么我们学到了什么?我认为这个问题(至少对我来说)最终是由于rspec钩子命名混乱造成的。我认为酒店房间的“套房”比酒店房间的“全部”要少。但显然,rspec示例的“套件”不仅仅是“全部”示例。实际上,一组rspec示例仅仅是“spec目录下的所有示例”。全部运行后清理监狱长没有任何效果。我们需要在每个规范之后清理它们 - 并且需要运行test_reset!在after(:all)块中。

希望这可以帮助别人...

+0

之后(:全部)在每次测试后都不运行 - 在所有测试结束后运行一次。你可能想调用test_reset!在after(:each)块中。 –

相关问题