【问题标题】:autotest and rspec giving different answersautotest 和 rspec 给出不同的答案
【发布时间】:2011-07-11 20:25:57
【问题描述】:

我有一个正在使用 rspec2 (2.6.4)、capybara 和 selenium 测试的应用程序。

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

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

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

Autotest 然后重新加载所有测试,当它到达请求测试时,它们都再次失败

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

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 (group :test)

  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'

这让我困惑了一段时间 - 有什么想法吗?甚至对如何开始查看堆栈跟踪以查看两个调用的不同之处有任何想法?

【问题讨论】:

  • autotest 无法加载您的spec_helper.rb
  • hmmm - 这是一个想法 - 不确定规范助手中是否有其他测试所需的任何内容 - 我会坚持调试并查看...谢谢
  • 好吧,谢谢你的建议,但遗憾的是不是这样......但从我一直在做的调试中可以清楚地看出,问题不在于登录用户,而在于在测试中创建了用户,所以我开始研究交易和更清洁的事情......

标签: ruby-on-rails ruby-on-rails-3 devise rspec2 capybara


【解决方案1】:

解决了,有点。这里到底发生了什么仍然是一个谜,但这里准确总结了问题的真正含义以及我是如何解决的。自动测试不是罪魁祸首 - 问题是在一批中运行所有测试。运行 rspec spec/**/* 会导致同样的错误。这是一个线索,表明问题与测试之间未能正确清理数据库有关。我正在使用设计,因此最终依赖 Warden 进行基于机架的身份验证。根据 Warden 文档,我调用了 Warden.test_reset!在 after(:suite) 块中。如果我将其移至 after(:all) 块,则无论是单独运行、作为请求测试还是在一个块中运行所有测试,测试都会通过相同的测试。

那么我们学到了什么?我认为问题(至少对我而言)最终是由 rspec 钩子的令人困惑的命名引起的。我认为酒店中的“套房”房间少于酒店中的“所有”房间。但显然,rspec 示例的“套件”不仅仅是“所有”示例。实际上,一套 rspec 示例只是“spec 目录下的所有示例”。在他们全部运行之后清理守望者没有任何效果。我们需要在每个规范之后清理它们 - 为此需要运行 test_reset!在 after(:all) 块中。

希望这对某人有所帮助...

【讨论】:

  • after(:all) 不会在每次测试后运行——它会在所有测试完成后运行一次。您可能想调用 test_reset!在 after(:each) 块中。
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2019-09-19
相关资源
最近更新 更多