【问题标题】:How to mock an import express.js supertest?如何模拟 import express.js 超级测试?
【发布时间】:2017-03-01 19:50:35
【问题描述】:

我有一些控制器/路由来处理用户注册:

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 是用正确的参数调用的。

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: 'te.st@gmail.com', 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));
      })
  });
});

我希望从控制器调用UserMock,但是这个模拟似乎只模拟在userIntegrationTest.js 中导入的User 模型。

如何模拟在controllers/user.js 中导入的User

【问题讨论】:

    标签: node.js unit-testing express sinon supertest


    【解决方案1】:

    您可以使用这个 proxyquire 库 (https://github.com/thlorenz/proxyquire)。

    使用示例:

    var apiCallsMock = require('./apiCallsMock');
    var messageParser  = proxyquire('../messageParser', {'./apiCalls': apiCallsMock});
    var app = proxyquire('../index', {'./messageParser': messageParser});
    

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 2018-02-07
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多