这是我的模块。我喜欢测试方法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 这样的动态语言带来的遗产的一部分:-)