目前我正在为使用nodejs编写的服务器端代码编写一些单元测试. 现在,我的情况是我的自定义模块正在使用其他模块,我的或来自nodejs标准库,我想模仿它们.首先,我搜索了一些现有的解决方
现在,我的情况是我的自定义模块正在使用其他模块,我的或来自nodejs标准库,我想模仿它们.首先,我搜索了一些现有的解决方案,例如我发现:https://github.com/thlorenz/proxyquire和https://github.com/mfncooper/mockery.
但今天我尝试使用天真的方法,并做这样的事情:moduleUnderTest
var fs = require('fs'); exports.foo = function(){ console.log("===foo==="); fs.read(); }
和文件moduleUnderTestSpec:
var fs = require('fs'); var moduleUnderTests = require('../server/moduleUnderTests.js'); fs.read = function(){ console.log("===read==="); }
当我运行grunt jasmine_node时,我可以看到:
===foo=== ===read===
所以在这个简单的例子中,我可以将fs模块中的一个函数换成另一个函数.有什么情况我的方法不起作用?
首先看一下 sinon,因为它可以帮助你轻松地模拟或删除函数.当您在Node.js中需要模块时,模块将根据docs on modules进行高速缓存.
我在你的解决方案中看到的唯一问题是,如果你需要使用真正的fs.read,你将无法丢失它.例如,您可以像这样使用Sinon;
var fs = require('fs'); var sinon = require('sinon'); // mock fs.read sinon .stub(fs, 'read') .returns("string data"); // test your code that uses fs.read assert(fs.read.calledOnce); // then restore fs.read.restore();