【问题标题】:Unit test with promise handling - node.js带有承诺处理的单元测试 - node.js
【发布时间】:2018-06-28 08:21:04
【问题描述】:

我想在代码上使用异步功能进行单元测试。这是我在 user.test.js 上的代码

'use strict'
const UserDomain = require("../../../../../../bin/modules/users/repositories/commands/domain")
const UserHandler = require("../../../../../../bin/modules/users/repositories/commands/command_handler")
const expect = require('chai').expect;
const assert = require('chai').assert;
const sinon = require('sinon');
describe('User domain', () => {
describe('".login(data)"', () => {
    let user;
    beforeEach( () => {
        user = {
            clientId : "adithyavisnu",
            clientSecret : "secretOfmine@19"
        }

    });
    it("should return error when username/password is empty", (done)=> {
        done();
        // let 
    })

    it("should return object", async () => {
        const domainStub = sinon.stub(UserDomain.prototype, 'login');
        const result = await UserHandler.login(user);
        sinon.assert.calledOnce(domainStub);
        domainStub.restore();
    })
});
});

如果正常代码(不是上面的单元测试代码)const result = await UserHandler.login(user); 将有一个对象响应,但是当我在 user.test.js 中这样做时它没有得到响应。 result 未定义。

这里是 user_handler 代码

'use strict';
const User = require('./domain');
const login = async (data) => {
const postData = async () => {
    const user = new User();
    const result = await user.login(data);
    return result;
}
const response = await postData();
return response;
}

是我在代码上做错了什么还是缺少某些代码?

如果您确实认为信息不明确,我很抱歉

感谢您的回复

【问题讨论】:

  • 试试npmjs.com/package/promise 我更喜欢他们而不是异步等待
  • 嗨@BraveButter,实际上由于我缺乏经验,将所有代码从async-await重构为promise modules需要时间:(。但感谢您之前的建议。非常感谢希望我可以在下一次迭代中使用它

标签: node.js unit-testing async-await sinon stubs


【解决方案1】:

在正常流程中,UserHandler 调用 Domain.login 方法并返回结果对象。当您运行单元测试时,您正在对 Domain.login 方法进行存根。因此,它不会将结果作为正常流程返回。您可以让存根返回一些结果对象并对其进行测试,或者只是监视 Domain.login 而不是存根,如果您只想检查 Domain.login 是否被调用而不改变其行为。如果您愿意,请在此处阅读有关存根/间谍的更多信息 - http://sinonjs.org/releases/v1.17.7/stubs/

【讨论】:

  • 感谢您的回答,非常感谢。因此,我们无法像正常流程那样获得真正的响应,因为我们正在存根,并且检查响应的选项是使用声明的对象结构实现的,例如 .return(responsesObject) 函数。那是我从你的回答中得到的,是真的吗?
  • 是的。您可以让存根返回您想要的内容并进行测试。
  • 谢谢你的解释,它让我知道我要做什么
猜你喜欢
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2016-07-25
  • 1970-01-01
  • 2016-05-01
  • 2016-05-19
相关资源
最近更新 更多