Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js promise resolve无法在模拟函数中工作_Javascript_Unit Testing_Promise_Mocking - Fatal编程技术网

Javascript js promise resolve无法在模拟函数中工作

Javascript js promise resolve无法在模拟函数中工作,javascript,unit-testing,promise,mocking,Javascript,Unit Testing,Promise,Mocking,我继承了一个JS应用程序(节点)。JS不是我的强项,也绝对不是承诺。我的任务是使代码达到现代标准,即使用类和异步/等待。我试图成为一名优秀的开发人员,并创建单元测试。对db的调用被拉入一个单独的persistor类,其目的是模拟。然而,我创建的mock似乎不起作用。看来,wait没有等待,所以我嘲笑的方式可能有问题。测试失败,预期{}深度等于{Object(status,method,…)} 这是我的模拟持久器 const mockPersistor = { getModels: fun

我继承了一个JS应用程序(节点)。JS不是我的强项,也绝对不是承诺。我的任务是使代码达到现代标准,即使用类和异步/等待。我试图成为一名优秀的开发人员,并创建单元测试。对db的调用被拉入一个单独的
persistor
类,其目的是模拟。然而,我创建的mock似乎不起作用。看来,
wait
没有等待,所以我嘲笑的方式可能有问题。测试失败,
预期{}深度等于{Object(status,method,…)}

这是我的模拟持久器

const mockPersistor = {
    getModels: function getModels() {
        RootLogger.debug('mockPersistor.getModels()');
        return {
            Category: 'Category',
            Attribute: 'Attribute',
            Option: 'Option'
        };
    },
    setModels: function setModels() {
        RootLogger.debug('mockPersistor.setModels()');
    },
    findXref: function findXref(model, conditions) {
        RootLogger.debug(`mockPersistor.findXref(${model}, ${JSON.stringify(conditions)})`);

        return new Promise((resolve, reject) => {
            return {
                status: 'success',
                method: `findXref`,
                model: `${model}`,
                conditions: `${conditions}`
            };
        });
    }
};
试验方法为:

async getMagentoCategoryByNetSuiteId(netSuiteId, netSuiteRecordName) {
    this.log.debug(`SystemXrefCache.getMagentoCategoryByNetSuiteId(${netSuiteId}, ${netSuiteRecordName})`);

    const result = await this.findXref(
        this.models.Category, 
        { 
            netSuiteId: JSON.parse(netSuiteId), 
            netSuiteRecordName: netSuiteRecordName 
        }
    ); 

    return result;
}
findXref方法仅重定向到我创建的新persistor类方法(为了更好的重构目的),该方法的名称相同:

async findXref(model, conditions) {
    this.log.debug(`SystemXrefCache.findXref(${JSON.stringify(model)}, ${JSON.stringify(conditions)})`);
    return await this.persistor.findXref(model, conditions);
}
我尝试过在模拟中创建承诺的几种变体,但都没有效果。我一直在使用async/Wait,除非我忽略了明显的问题,所以这应该不是问题所在

那么,问题可能出在测试本身?我在这里也尝试过一些东西,但这是我的最新作品:

it('getMagentoCategoryByNetSuiteId returns successfully', function() {
        RootLogger.debug(`=== starting test getMagentoCategoryByNetSuiteId returns successfully ===`);
        const givenNetsuiteId = `99`;
        const givenNetsuiteRecordName = `recordName`;

        const expected = {
            status: 'success',
            method: `findXref`,
            model: `Category`,
            conditions: { 
                netSuiteId: 99, 
                netSuiteRecordName: `recordName` 
            }
        };

        const result = cache.getMagentoCategoryByNetSuiteId(
            givenNetsuiteId, 
            givenNetsuiteRecordName
        ).then( resp => {
            RootLogger.debug(`=== call completed!!! ===`);
            return resp;
        });

        expect(result).to.deep.equal(expected);
    });

测试中
result
的值将是函数返回的承诺,而不是期望的值。如果您想测试承诺是否解析为
expected
,您需要在
then()
中测试它,或者在测试中使用
async/await
。@标记似乎正确的,但它不起作用。我既没有得到log语句,也没有得到then块中新添加语句的结果:
expect({}).to.deep.equal(expected),应该失败。为了确保它没有将一个空对象与另一个空对象进行比较,我将上面注释中的expect更改为
expect({bad:'error'})。改为.deep.equal(预期)。还是不行,你用摩卡咖啡吗?如果是这样,它需要知道您正在使用
done()
或返回承诺来等待测试中的异步操作。看:@Mark\M你让我走对了路。你猜对了,我用的是摩卡咖啡。最后,我在接受的答案中使用了第二个选项,所以:。为其他人共享此链接。