javascript - 使用 mocha 测试调用内部 Promise 的函数

标签 javascript unit-testing promise mocha.js middleware

我有一个像这样的 JavaScript 函数:

var otherModule = require('../otherModule');

function myFn(req, res, next) {

  otherModule.queryFunction()
    .then(function(results) {
      res.json(results);
    })
    .catch(function(err)) {
      res.json({
        err: err
      });
    });
}

为了测试 myFn 函数,我在单元测试中模拟了(使用 mockery )otherModule.queryFunction ,以便它返回一些已知的结果。在 myFn 单元测试中,我想测试是否正在调用 res.json。我知道如果我正在测试 otherModule.queryFunction 我可以通过返回 promise 或将 done 参数传递给观察函数来实现这一点。但如果异步部分位于我正在测试的函数调用的函数内部,我无法弄清楚如何进行异步测试。

我尝试过这种方法但没有成功:

'use strict';
var chai = require('chai');
var mockery = require('mockery');
var expect = chai.expect;
var spies = require('chai-spies');
var myFn = require('path/to/myFn');
chai.use(spies);

describe('myFn tests', function (){

  var otherModule;
  var SOME_DATA = {data: 'hi'};
  beforeEach(function (){
    otherModule = {
      queryFunction: function queryFunctionMock(){
        var promise = new Promise(function(resolve, reject){
          resolve(SOME_DATA);
        });

        return promise;
      }
    };
  });

  beforeEach(function (){
    mockery.enable({
      warnOnReplace: false,
      useCleanCache: true
    });

    mockery.registerMock('../otherModule', otherModule);
  });

  afterEach(function (){
    mockery.disable();
  });

  it('res.json should be called with otherModule.queryFunction results', function (){
    req = chai.spy();
    res = chai.spy.object(['json']);
    next = chai.spy();

    myFn(req, res, next);

    expect(res.json).to.have.been.called();    
  });
});

最佳答案

我认为这里唯一的错误是,你需要在初始化 mock 之后移动被测组件的需求::

'use strict';
var chai = require('chai');
var mockery = require('mockery');
var expect = chai.expect;
var spies = require('chai-spies');
var myFn;
chai.use(spies);

describe('myFn tests', function (){

  // [...]

  beforeEach(function (){
    mockery.enable({
      warnOnReplace: false,
      useCleanCache: true
    });

    mockery.registerMock('../otherModule', otherModule);

    // now load the component:
    myFn = require('path/to/myFn');
  });

关于javascript - 使用 mocha 测试调用内部 Promise 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35410982/

相关文章:

javascript - 使用 javascript 链接显示更多文本

javascript - 在预览中显示多个图像

javascript - CKEditor:调用 editor#setData 后恢复插入位置

node.js - 调用 "then"时 Promise 挂起

javascript - 在级联promise中修改it block 中本地定义的变量时如何修改

javascript - 如何*ngFor 超过一组 ngModel 可绑定(bind)属性

java - 如何对在其 builder() 方法中使用静态单例工厂的构建器进行单元测试?

java - 使用 JUnit 在 Spring 中测试 CRUD 时获取同一行的多个 ID

java - 错误 : JUnit command line test classes inside the jar

javascript - 确保代码以正确的顺序执行 JavaScript