node.js - Proxyquire 调用原始文件而不是 stub

标签 node.js mocha.js proxyquire

您好,我正在尝试使用 proxyquire 在我的 Controller 中模拟一个模型。但是出于某种原因,当尝试注入(inject)模拟时,会调用原始文件。

这就是 Controller 内部需要我的模型的方式:

var Product = require('./product.model');

这就是我尝试 stub 模型的方式

  var proxyquire = require('proxyquire').noCallThru().noPreserveCache();
  var productsStub = {findAsync: sinon.stub()};
  productsStub.findAsync.resolves(mockProducts);
  var mockProducts = [{_id:'0001',title: 'title', price: 123, description: 'le description'}];
  var productController = proxyquire('./product.controller',{'./product.model':productsStub});

但是当我运行我的测试时我得到这个错误

Running "mochaTest:unit" (mochaTest) task
>> Mocha exploded!
>> OverwriteModelError: Cannot overwrite `Product` model once compiled.
>>     at Mongoose.model (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/mongoose/lib/index.js:360:13)
>>     at Object.<anonymous> (/Users/victor/Documents/projects/estudo/mean/meanshop/server/api/product/product.model.js:15:27)
>>     at Module._compile (module.js:409:26)
>>     at normalLoader (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:199:5)
>>     at Object.require.extensions.(anonymous function) [as .js] (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:216:7)
>>     at Module.load (module.js:343:32)
>>     at Function.Module._load (module.js:300:12)
>>     at Module.require (module.js:353:17)
>>     at require (internal/module.js:12:17)
>>     at Object.<anonymous> (/Users/victor/Documents/projects/estudo/mean/meanshop/server/api/product/product.model.spec.js:1:15)
>>     at Module._compile (module.js:409:26)
>>     at normalLoader (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:199:5)
>>     at Object.require.extensions.(anonymous function) [as .js] (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:216:7)
>>     at Module.load (module.js:343:32)
>>     at Function.Module._load (module.js:300:12)
>>     at Module.require (module.js:353:17)
>>     at require (internal/module.js:12:17)
>>     at /Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/mocha/lib/mocha.js:220:27
>>     at Array.forEach (native)
>>     at Mocha.loadFiles (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/mocha/lib/mocha.js:217:14)
>>     at MochaWrapper.run (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/grunt-mocha-test/tasks/lib/MochaWrapper.js:51:15)
>>     at /Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/grunt-mocha-test/tasks/mocha-test.js:86:20

我的问题是,如果理论上不会调用原始 products.model.js 模块,为什么我会得到这个。

最佳答案

proxyquire 不会 stub 未列出的模块,它们将像往常一样被要求,所以 看起来您在 product.controller 中有更多的依赖项,并且它们通常都是必需的。

除了为 proxyquire 提供完整的 stub 之外,我找不到解决这个问题的好方法,例如为直接导入文件所需的所有文件添加 stub 。

关于node.js - Proxyquire 调用原始文件而不是 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39388741/

相关文章:

node.js - 我想在heroku 中托管一个聊天应用程序(Socketio、Node)。需要使用人群生成

mysql - 将 IBM WATSON Conversation 连接到数据库。拉取数据

javascript - 测试 Node 快速端点和 stub 第 3 方 api 调用

node.js - Proxyquire:无法 stub fs.readFileSync

javascript - 在继续更改 DOM 函数之前如何等待异步数据库调用解析?

javascript - Socket.io 和 Mocha 测试

Javascript Mocha 测试 - 在函数表达式中测试函数表达式

ruby-on-rails - Rails - 如何为整个测试套件 stub 一个方法?

javascript - 为什么我的 NodeJS Web 服务器不从我的目录中获取文件?