【问题标题】:expects() of a spec visible outside to other specs when running 'rspec spec'运行“rspec spec”时,对其他规范可见的规范的expects()
【发布时间】:2013-07-11 20:33:32
【问题描述】:

我有两个规范,当单独运行时,可以正常执行,但是当我使用“rspec spec”执行它们时,后者会失败。

第一:

    describe "DB Archival" do
      it "should archive the nodes which are deleted" do
        node_data_archival = mock()
        NodeDataArchival.expects(:new).with('node1').returns(node_data_archival)
        node_data_archival.expects(:export_to_csv).with([1,2])
        db_archival.archive_deleted_nodes
      end
    end

第二:

describe "Export to CSV" do
  it "should export data to a csv file" do
    class School < ActiveRecord::Base
    end

    School.expects(:column_names).returns(["id", "name"])
    node_data_archival = NodeDataArchival.new("school")
    node_data_archival.export_to_csv(rows, filename)
   end
end

第二次抛出:

$ rspec spec
.......F......

Failures:

  1) Export to CSV should export data to a csv file
     Failure/Error: node_data_archival1 = NodeDataArchival.new("school")
     Mocha::ExpectationError:
       unexpected invocation: NodeDataArchival.new('school')
       unsatisfied expectations:
       - expected exactly once, not yet invoked: School(Table doesn't exist).column_names(any_parameters)
       satisfied expectations:
       - expected exactly once, invoked once: NodeDataArchival.new('node1')
       - expected exactly once, invoked once: #<RSpec::Mocks::Mock:0x7ff4693d3028>.export_to_csv([1, 2])
     # ./spec/entity_traversal/node_data_archival_spec.rb:16:in `block (2 levels) in <top (required)>'

我的问题是—— 1)为什么它试图找到一个期望而不是在第二个规范中创建一个实际的 NodeDataArchival 实例? 2)为什么第二个规范能够找到第一个规范声明的expects()?

PS:仅当我使用“rspec spec”同时运行所有规范并且两个规范单独运行良好时才会出现此问题。

编辑: 使用的版本: ruby-1.9.3-p125, rspec (2.13.0) 和摩卡(0.14.0)

编辑:使用 rspec-rails-mocha (0.3.2) 而不是 mocha (0.14.0) 解决了这个问题。

【问题讨论】:

  • 期望值不应该“泄露”,但您能分享您的完整规格吗?此外,这是否是您的 spec/ 目录中仅有的两个规范(即,当您执行 rspec spec 时,这两个规范是否会运行)?
  • @PeterAlfvin 是的,基本上只运行这两个规范就会出错。我在这里都提到了 [link]pastebin.com/jZ50Fnd6 。另外,我通过在第一个规范中使用 should_receive 解决了它,看起来像是 expects() 的问题
  • 您是否将这两个文件合并并粘贴为一个文件?我问是因为那里只有一个require 'spec_helper'
  • 你能解释一下为什么rspec会输出这么多.吗?我认为每个it 调用都应该有一个,而这两个文件中只有两个。
  • 是的,我连接并粘贴了两个规范文件。但即使在单一规格中(就像我粘贴的那样),两者都是单独描述的。那么,上面的 expects() 不应该对另一个人可见?

标签: ruby rspec rspec2 rspec-rails


【解决方案1】:

根据评论线程,这似乎是您引用的 ruby​​、rspec 和 mocha 版本之间相当严重的不兼容。 mocha 的 github 站点没有提交此类问题,更不用说包含在他们的“已知问题”文档中了。

尽管 mocha gem 似乎已被您随后尝试的 rspec-rails-mocha gem 隐式弃用以供 rspec 使用,但您可能希望提交针对 mocha 的问题。如果你想成为一个特别优秀的公民,你可以先试用 ruby​​ 2.0 和 rspec 2.14,然后看看它们有什么影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2018-01-11
    • 2019-11-18
    相关资源
    最近更新 更多