如何在与nodejs和babel集成测试时在导入模块中固执



我要做的事情:运行一个测试,该测试用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);
});

以上未预期在控制台中"固执"。

我已经尝试了几种解决此类问题的解决方案,包括Rewire和Proxyquire,发现嘲弄是唯一真正有效的嘲弄。

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();
});

最新更新