如何在使用nodejs和babel进行集成测试时在导入的模块中存根函数

时间:2017-03-06 14:35:36

标签: javascript node.js testing mocha babeljs

我要做的是:运行一个测试,使用supertest模块访问其余界面,并存储一些在那里导入的函数。

设置如下:

的node.js
babel-plugin-rewire模块
sinonjs
摩卡

文件:

app.js

import * as emailService from './services/emailService';

router.get('/sendEmail',function(req,res,next) {
  emailService.send('subject');
});

test.js

import supertest from 'supertest';
import app from '../js/app';
import * as emailService from '../js/services/emailService';
import { __RewireAPI__ as emailRewire } from '../js/services/emailService';

it.only('rewiring test', async function() {

 const sendStub = sinon.stub(emailService,'send',function() {
    console.log('stubbed');
  });

  emailRewire.__Rewire__('send',sendStub);

  await supertest(app)
    .get('/sendEmail')
    .expect(200);
});

以上内容未按预期在控制台中打印“stubbed”。

1 个答案:

答案 0 :(得分:0)

我为这样的问题尝试了几种解决方案,包括重新发送和代理查询,并发现mockery是唯一真正有用的问题。

import supertest from 'supertest';
import * as emailService from '../js/services/emailService';
import mockery from 'mockery';

it.only('rewiring test', async function () {

    const sendStub = sinon.stub(emailService, 'send', function () {
        console.log('stubbed');
    });

    mockery.enable({
        useCleanCache: true,
        warnOnUnregistered: false
    });
    mockery.registerMock('./services/emailService', {
        send: sendStub
    });
    const app = require('../js/app').default;

    await supertest(app)
        .get('/sendEmail')
        .expect(200);

    mockery.deregisterAll();
    mockery.disable();
});