无法在 Rails 的 Rspec 单元测试中测试模块内的方法



这是我的模块。我喜欢测试方法load_csv

我引用了此示例示例链接

并编写了这段代码。下面是模块代码

require 'csv'
module DummyModule
  class Test
    def load_csv(filename)
      CSV.read(filename, :row_sep => "r", :col_sep => "t")
    end
  end
end

这是我的Rspec

require 'spec_helper'
describe DummyModule do
  let(:data) { "titletsurnametfirstnamertitle2tsurname2tfirstname2r" }
  let(:result) { [["title", "surname", "firstname"], ["title2", "surname2", "firstname2"]] }
  before(:each) do
    @attribute_validator = TestAttributeValidator.new
  end
  it "should parse file contents and return a result" do
    puts data.inspect
    puts result.inspect
    File.any_instance.stubs(:open).with("filename","rb") { StringIO.new(data) }
    @attribute_validator.load_csv("filename").should eq(result)
  end
end
class TestAttributeValidator
  include DummyModule
end

它给了我这个错误

DummyModule should parse file contents and return a result
 Failure/Error: @attribute_validator.load_csv("filename").should eq(result)
 NoMethodError:
   undefined method `load_csv' for #<TestAttributeValidator:0xd0befd>
 # ./spec/extras/dummy_module_spec.rb:15:in `(root)'

请帮助

你可能不想要你的

class Test

在您的module定义中。像这样,以下内容将起作用:

@attribute_validator_tester = TestAttributeValidator::Test.new
@attribute_validator_tester.respond_to? 'load_csv'
=> true

但这可能不是你的意图。将module包含在类中会将module的所有"功能"(即所有方法,但也包括常量和类)添加到包含module的类中。在您的示例中,您将class Test添加到 class TestAttributeValidator 的命名空间中,此类的实例将具有所需的方法load_csv

只需省略module中的类定义,一切都会好起来的。

(添加另一个答案,因为这实际上是另一个问题)

谷歌搜索Errno::ENOENT会导致这个答案,但这几乎没有必要,因为错误消息确实说明了问题,找不到您的文件。由于您存根了"filename"因此应该找到您正在使用的CSV版本是否仍然使用open来打开文件(当前的 ruby CSV 阅读器似乎这样做,请参阅源代码)那么它实际上应该工作。

但是,根据您的 ruby 版本,CSV库可能会添加更多选项,我引用的版本universal_newline: false合并到open的选项,因此您的存根不会具有它期望的所有参数,并将您的调用转发到找不到您的"filename"的"常规"方法。您应该相应地检查您的 ruby 和存根的确切版本。

这可能是像 ruby 这样的动态语言带来的遗产的一部分:-)

相关内容

  • 没有找到相关文章

最新更新