Sly*_*Sly 3 rspec ruby-on-rails stubbing
我正在尝试存根File.open以测试我读取CSV文件的方法.
这是模型:
class BatchTask
def import(filename)
CSV.read(filename, :row_sep => "\r", :col_sep => ",")
end
end
Run Code Online (Sandbox Code Playgroud)
这是规范代码:
let(:data) { "title\tsurname\tfirstname\rtitle2\tsurname2\tfirstname2\r"}
let(:result) {[["title","surname","firstname"],["title2","surname2","firstname2"]] }
it "should parse file contents and return a result" do
File.stub(:open).with("file_name","rb") { StringIO.new(data) }
person.import("file_name").should == result
end
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这样做时,我得到(stacktrace):
Errno::ENOENT in 'BatchTask should parse file contents and return a result'
No such file or directory - file_name
/Users/me/app/models/batch_task.rb:4:in `import'
./spec/models/batch_task_spec.rb:10:
Finished in 0.006032 seconds
Run Code Online (Sandbox Code Playgroud)
我一直在撞击这个,无法弄清楚我做错了什么.任何帮助将不胜感激!
提供一个堆栈跟踪会很有帮助,虽然我会猜测它为什么会发生.另外,我相信你在这里接近并不好,我会详细说明我认为你应该如何测试.
简单地说,我认为CSV.read不会使用File.open.它可以使用Kernel#open或以其他各种方式在Ruby中打开文件.File.open无论如何,你不应该在测试中存根.
有一本很棒的书名为"面向测试的成长对象软件",它有一个需要规则:
仅存储您控制的类/接口上的方法
这有一个非常简单的原因.当您进行测试双打(存根)时,主要原因是界面发现 - 您想要弄清楚您的类的界面应该是什么样子,双打为您提供整洁的反馈.还有一个次要原因 - 在某些情况下(当库不是非常简陋时),存根外部库往往非常棘手.因此,您可以在这里采取一些不同的方法,我将列举:
CSV.read,找到一种方法,当你传递一个打开File,然后在测试中存根.即,让您的代码打开文件而不是CSV.这样你就可以轻松地存根CSV.read而不是存根.这可能有点戏剧性,但实质上,你不是在测试代码,而是在测试CSV库.它应该已经有了自己的测试,无论如何你都不需要测试它.相反,你可以依赖它可以工作的事实,只是将调用存根.除此之外,我可能会选择第三个.我不喜欢在我的单元测试中测试依赖项.但是如果你想让你的测试调用那个代码,我建议找到一种方法来做第二个选项(CSV.new(file)应该做的伎俩,但我没有时间去调查),如果没有别的办法,最后会回到#1.
| 归档时间: |
|
| 查看次数: |
2271 次 |
| 最近记录: |