首页 > 解决方案 > 带有 Promise 和 Proxyquire 的单元测试对象方法

问题描述

我有一个 User 对象,其中包含一个返回 Promise 的方法 insert。

insert() {
    return new Promise(function(resolve, reject) {
        if (this.id){
            reject("This object is already inserted in base");
        }
        // Some things here
        console.log('Printing something here to test');
        // mysql.query('Some query')
        resolve(this);
        // Some things here
    }.bind(this));
}

如果用户对象已经有一个 ID,我想测试该承诺是否被拒绝

我使用我的测试 mocha、chai 和 chai-as-promised。

我想要的是 proxyquire mysql.query 以便它返回一个修复结果,该结果适用于其他测试用例。但现在我正是想尝试插入方法拒绝。

我试图这样做:

it("Inserting user with id should fail", () => { 
        const proxy = proxyquire.load('../models/Users', {
            './dbc': {
                query : function(query, args) {
                    return new Promise(function(resolve, reject) {
                        resolve({ insertId : 2});
                    })
                }
            }
        });

        var us = new proxy();
        us.id = 3;
        us.password = "test";
        us.username = "testLogin";
        us.mail = "testMail";
        us.isAdmin = "false";

        expect(us.insert()).to.be.rejected();

    });

我不明白的是:

它给了我这个错误:

TypeError: expect(...).to.be.rejected 不是函数

而且,我的 console.log 发生在拒绝之后,我可以在 npm 测试结果中看到它。最后我还尝试在 if 中输入一些日志以确保它不是问题,实际上它在 if 中,所以似乎调用了拒绝方法但什么也不做。

所以我不知道,我是否以错误的方式使用承诺?还是我的测试方式不对?

标签: javascriptunit-testingpromisemocha.jschai

解决方案


推荐阅读