3

目前,我正在为使用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模块中的一个功能换成另一个。有没有我的方法行不通的情况?

4

2 回答 2

5

首先看一下sinon,因为它可以帮助您轻松地模拟或存根函数。

当您require使用 Node.js 中的模块时,模块会根据 modules 上的文档进行缓存。

我在您的解决方案中看到的唯一问题是,稍后如果您需要使用真实的fs.read,您将无法使用它,因为它已经丢失了。例如你可以像这样使用诗乃;

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();
于 2013-11-13T09:51:20.677 回答
2

您的方法没问题,但只有在模块导出对象时才有效。如果一个模块导出函数(经常发生)或其他任何东西,你就不能模拟它。也就是说,您只能模拟模块对象的一个​​属性,而不能模拟整个对象。

于 2013-11-13T11:20:23.500 回答