当前位置 : 主页 > 网页制作 > Nodejs >

node.js – nodejs – 模拟模块,天真的方法

来源:互联网 收集:自由互联 发布时间:2021-06-16
目前我正在为使用nodejs编写的服务器端代码编写一些单元测试. 现在,我的情况是我的自定义模块正在使用其他模块,我的或来自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();
网友评论