为什么我的rspec测试会自行通过,但是当我给出一个特定的测试运行时会失败?

时间:2014-05-07 23:37:11

标签: ruby-on-rails rspec sunspot webmock

当我运行rspec来运行所有测试时,它们都会通过,但是当我给出一个特定的文件名时,它会失败。

$ rspec spec/controllers/refinery/books/admin/books_controller_spec.rb


  2) Refinery::Books::Admin::BooksController GET :new responds 200 success
     Failure/Error: login_admin_user #Gives 404
     WebMock::NetConnectNotAllowedError:
       Real HTTP connections are disabled. Unregistered request: POST http://localhost:8981/solr/default/update?wt=ruby with body '<?xml ...' with headers {'Content-Type'=>'text/xml'}

       You can stub this request with the following snippet:

       stub_request(:post, "http://localhost:8981/solr/default/update?wt=ruby").
         with(:body => "<?xml ...",
              :headers => {'Content-Type'=>'text/xml'}).
         to_return(:status => 200, :body => "", :headers => {})

       registered request stubs:

       stub_request(:post, "http://localhost:8983/solr/test/update?wt=ruby").
         with(:headers => {'Content-Type'=>'text/xml'})

       ============================================================
     # ./lib/rsolr/connection.rb:15:in `execute'
     # (eval):2:in `post'
     # ./spec/support/controller_macros.rb:21:in `login_admin_user'

我有嘲笑&amp;已经存在,所以为什么会失败?我唯一能看到的是现有存根是'/ test /'而请求是'/ default /'。这是怎么改变的?

好的,我又在另一个规格上遇到了这个问题。这是规格: https://gist.github.com/starrychloe/1d79d9925f9b79ae5c01

我找到了这个solr / solr.xml

<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">
  <cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:}">
    <core name="default"     instanceDir="." dataDir="default/data"/>
    <core name="development" instanceDir="." dataDir="development/data"/>
    <core name="test"        instanceDir="." dataDir="test/data"/>
  </cores>
</solr>

就像rspec在生产环境中运行一样,即使我明确地给出了环境

$ RAILS_ENV=test rspec spec/controllers/refinery/books/books_controller_spec.rb

我认为这是一个rspec问题。 rspec -v:版本2.14.7。

3 个答案:

答案 0 :(得分:2)

我在stub_request(:post, "http://localhost:8981/solr/default/update?wt=ruby").to_return(:status => 200, :body => "", :headers => {})之前添加了login_admin_user,但我不认为这是根解决方案。

答案 1 :(得分:2)

它可能与另一项测试相互作用。

尝试以随机顺序运行套件

rspec spec --order rand

和/或尝试运行该控制器或控制器的所有测试。

答案 2 :(得分:0)

您正在使用webmock,默认情况下禁用所有HTTP连接。

您可以修改Gemfile以禁用自动要求,如下所示:

gem "webmock", :require => false

并且需要webmock(例如require 'webmock/rspec')。在为某些测试禁用HTTP连接后,请记住WebMock.allow_net_connect!以允许其他测试使用真正的http连接。

另一种选择是WebMock.disable_net_connect!(:allow_localhost => true)在允许localhost时禁用外部请求。