自动测试和rspec给出不同的答案

时间:2011-07-11 20:25:58

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

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

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

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

当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 "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'

这一直困扰着我一段时间 - 任何人的想法?甚至关于如何开始查看堆栈跟踪以查看两个调用的不同之处的任何想法都会有所不同?

1 个答案:

答案 0 :(得分:2)

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

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

希望这有助于某人...