0

我正在使用包 aws-param-store,并且正在尝试编写对 getParametersByPath() 进行存根调用的单元测试。包可以在这里找到: https ://www.npmjs.com/package/aws-param-store

这是我用来存根调用的 sinon 代码。函数 getParametersByPath 是一个异步函数,所以我试图返回一个已解决的承诺来存根它:

const awsParameterStore = require('aws-param-store');
const sinon = require("sinon");
let sandbox = sinon.createSandbox();

// In My Test:
let parms = new Map();
parms.set("key1","value1");
parms.set("key2","value2");  

sandbox.stub(awsParameterStore,'getParametersByPath').callsFake(async function(prefix){
    console.log("INSIDE STUB for getParametersByPath:" + prefix);       
    return Promise.resolve(parms);
});

我的应用程序像这样调用函数:

let parameters = await awsParameterStore.getParametersByPath("/foo");

但是,我没有取回虚拟参数的映射,而是得到一个空对象 {}。我可以看到存根被调用。关于如何正确存根的任何想法,以便我可以在单元测试中返回一些虚拟参数?谢谢!

4

2 回答 2

1

我试图检查你的代码,它完全没问题。

import test from 'ava'

const awsParameterStore = require('aws-param-store');

const sinon = require('sinon')

test('test stub', async t => {
    let parms = new Map();
    parms.set("key1","value1");
    parms.set("key2","value2");
    parms.set("key3","value3");
    parms.set("key4","value4");

    sinon.stub(awsParameterStore, 'getParametersByPath').callsFake(async function(prefix){
        console.log("INSIDE STUB for getParametersByPath:" + prefix)
        return Promise.resolve(parms);
    })

    const res = await awsParameterStore.getParametersByPath('/some-prefix')

    console.log(JSON.stringify(res))

    res.forEach((value, key) => {
        console.log(`[${key}]= ${value}`)
    })

    t.true(true)
})

什么是堰:

console.log - 显示结果是 {}

但是如果您一一调试或记录该值,您会看到存根工作正常:

Debugger attached.
INSIDE STUB for getParametersByPath:/some-prefix
{}
[key1]= value1
[key2]= value2
[key3]= value3
[key4]= value4
  ✔ test stub

UPD:问题是如何通过JSON.stringify()记录地图。因此,您必须将地图记录为:

console.log(JSON.stringify([...res]))

于 2020-01-17T14:29:59.797 回答
0

这是单元测试解决方案:

index.js

const awsParameterStore = require('aws-param-store');

async function main() {
  let parameters = await awsParameterStore.getParametersByPath('/foo');
  return parameters;
}

module.exports = main;

index.test.js

const main = require('./');
const sinon = require('sinon');
const awsParameterStore = require('aws-param-store');
const { expect } = require('chai');
let sandbox = sinon.createSandbox();

describe('59787603', () => {
  it('should pass', async () => {
    let parms = new Map();
    parms.set('key1', 'value1');
    parms.set('key2', 'value2');
    sandbox.stub(awsParameterStore, 'getParametersByPath').resolves(parms);

    const actual = await main();
    expect(actual).to.be.eql(parms);
  });
});

覆盖率 100% 的单元测试结果:

  59787603
    ✓ should pass


  1 passing (11ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.js |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

源代码:https ://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/59787603

于 2020-02-28T10:01:36.817 回答