关于Rails上的ruby:autotest和rspec给出不同的答案

autotest and rspec giving different answers

我有一个正在使用rspec2(2.6.4),水豚和selenium进行测试的应用程序。

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

当我通过自动测试运行请求规范时,它们全部失败,并显示一条消息"找不到ID = **的用户。

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

然后自动测试重新加载所有测试,当达到请求测试时,它们又全部失败

正在由factory-girl创建用户,并使用devise登录,如下所示:

1
2
3
4
5
6
7
8
before(:each) do
  @user = Factory(:user)  
  login_as @user
end

after(:each){
    logout
  }

在规范助手中,我有

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

这些是我已安装的相关ruby(组:test)

1
2
3
4
5
6
7
  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'

这已经困扰了我一阵子-有人在想什么吗?甚至对如何开始查看堆栈跟踪以了解两个调用在何处有所不同的任何想法?


已解决。真正发生的事情仍然是一个谜,但是这里是问题的真相以及我如何解决的准确摘要。自动测试不是罪魁祸首-问题是批量运行所有测试。运行rspec spec/**/*会导致相同的错误。这表明问题与测试之间无法正确清理数据库有关。我使用的是devise,因此最终还是要依靠看守来进行基于机架的身份验证。遵循Warden文档后,我致电Warden.test_reset!在after(:suite)块中。如果将其移至after(:all)块,则无论是作为请求测试单独运行还是作为一个块中的所有测试运行,测试均通过相同的测试。

那我们学到了什么?我认为这个问题(至少对我而言)最终是由于rspec挂钩的命名混乱引起的。我认为酒店的房间"套房"比酒店的"所有"房间都少。但是显然,rspec示例的"套件"比所有示例都重要。实际上,一组rspec示例只是" spec目录下的所有示例"。它们全部运行后清理看守无效。我们需要在每个规格后清理它们-为此,需要运行test_reset!在after(:all)块中。

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