2017-03-06 19 views
0

我在做什麼:運行一個測試,用supertest模塊命中其餘接口,並存儲一些導入到那裏的函數。如何在使用nodejs和babel進行集成測試時在導入的模塊中存根功能

的設置是這樣的:

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

以上不會在控制檯預期打印 「存根」。

回答

0

我已經嘗試了幾個解決方案,像這樣的問題,包括rewire和proxyquire,並發現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(); 
}); 
+0

嘗試過,但它不工作。首先,sendStub不是對象的完整模擬,但也有其他事情必須進行 – arisalexis

+0

正確的是,您必須將對象傳遞給具有「發送」屬性的registerMock。更新了代碼示例。 –

+0

謝謝你,但仍然無法正常工作。應用程序有一個原始的電子郵件服務,我不知道爲什麼/如何 – arisalexis

相關問題