首页 > 解决方案 > node.js 模块中的 Sinon Stub 依赖类

问题描述

我有一门课如下


nx-user.js
class NXUser {
constructor() {}

view(guid, data) {
  //do something
}

}

然后我有如下用户控制器模块,它具有 NxUser 类的依赖项

用户控制器.js

const userDb = new NXUser();
import NXUser from "../../../persistence/nx-user";
const allUsers = () => {
    return userDb.view()
}

导出 {allUsers }

我为控制器单元测试的 NxUser 类的存根视图函数编写了以下代码。但它不起作用。它总是调用实际的一个 instated 一个存根的

userController-test.js

let userdb=NXUser();
describe("user controller", function () {
 let stubValue = [{
  "name": "Urvashi Parmar",
  "email": "urvashi.parmar@nationalexpress.com"]}

  it("Should create user", () => {           
            sinon.stub(userdb, 'create').resolves(stubValue);            
            userController.allUsers ().then((body) => {
                expect(body[0].name).to.equal(stubValue .name);
                done();
            });
        })  
}

标签: node.jschaisinon

解决方案


因为我还不能评论,所以我需要给出完整的答案。

困惑:在您的 userController-test.js 中,您正在尝试测试 NXUser.create,而在文件 nx-user.js 中没有创建的定义。

假设:您正在尝试测试 NXUser.view。

此示例是根据您的代码创建的,并且运行良好。控制台日志“已调用”将不会被调用。

强调:

  1. 直接存根 NXUser 视图,而不是 userdb.create;
  2. 我在测试中使用 async-await。
const sinon = require('sinon');
const { expect } = require('chai');

class NXUser {
  constructor() {}
  view(guid, data) {
    console.log('Called');
    return new Promise((resolve) => resolve([]));
  }
  // Add this only for dummy.
  create() {
    return new Promise((resolve) => resolve([]));
  }
}

const userController = {
  allUsers() {
    const userDb = new NXUser();
    return userDb.view();
  }
}

describe('user controller', function () {
  // Suppose you test view user.
  it('should view user', async function () {
    const stubValue = [{
      name: 'Urvashi Parmar',
      email: 'urvashi.parmar@nationalexpress.com'
    }];
    // Suppose you stub method view and not create.
    const stubUserDBView = sinon.stub(NXUser.prototype, 'view');
    stubUserDBView.resolves(stubValue);

    const body = await userController.allUsers();
    expect(body).to.be.an('array').that.have.lengthOf(1);
    expect(body[0]).to.have.property('name', stubValue[0].name);

    // Restore stub.
    stubUserDBView.restore();
  });
});
$ npx mocha stackoverflow.js


  user controller
    ✓ should view user


  1 passing (11ms)

$

希望这可以帮助。


推荐阅读