2017-03-01 15 views
0

私がサインアップし、ユーザーを扱ういくつかのコントローラ/ルートを持っている:import express.js supertestをモックする方法は?

controllers/user.js

const User = require('../models/User');  // What I want to mock! 
... 
/** 
* POST /signup 
* Create a new local account. 
*/ 
exports.postSignup = (req, res, next) => { 
    ... 
    const user = new User({ 
    email: req.body.email, 
    password: req.body.password 
    }); 
    ... 

私はUserが右の引数で呼び出されることをテストします。私はUserMockは、コントローラから呼び出されることを期待

test/userIntegrationTest.js

const request = require('supertest'); 
const app = require('../app.js'); 
const sinon = require('sinon'); 
const User = require('../models/User'); 

describe('POST /signup',() => { 
    it('should create user with valid email', (done) => { 
    const formdata = {email: '[email protected]', password: 'asdf'}; 

    const UserMock = sinon.mock(User);  // This mock doesn't do what I want! 

    request(app) 
     .post('/signup') 
     .send(formdata) 
     .expect(200) 
     .end(function(res) { 
     expect(UserMock.calledOnce).to.be.true; 
     expect(UserMock.calledWith(formdata)); 
     }) 
    }); 
}); 

しかし、このモックはuserIntegrationTest.jsにインポートUserモデルを欺くようです。

Usercontrollers/user.jsにインポートするにはどうすればよいですか。

答えて

1

proxyquire lib(https://github.com/thlorenz/proxyquire)です。使い方の

例:

var apiCallsMock = require('./apiCallsMock'); 
var messageParser = proxyquire('../messageParser', {'./apiCalls': apiCallsMock}); 
var app = proxyquire('../index', {'./messageParser': messageParser}); 
関連する問題