web-dev-qa-db-ja.com

Nodejs:sinonとasync / awaitを使用したテスト

Sinonとasync/awaitを使用してこのテストを実行するのに問題があります。これが私がしていることの例です:

_// in file funcs
async function funcA(id) {
    let url = getRoute53() + id
    return await funcB(url);
}

async function funcB(url) {
    // empty function
}
_

そしてテスト:

_let funcs = require('./funcs');

...

// describe
let stubRoute53 = null;
let stubFuncB = null;
let route53 = 'https://sample-route53.com/' 
let id = '1234'
let url = route53 + id;

beforeEach(() => {
    stubRoute53 = sinon.stub(funcs, 'getRoute53').returns(route53);
    stubFuncB = sinon.stub(funcs, 'funcB').resolves('Not interested in the output');
})

afterEach(() => {
    stubRoute53.restore();
    stubFuncB.restore();
})

it ('Should create a valid url and test to see if funcB was called with the correct args', async () => {
    await funcs.funcA(id);
    sinon.assert.calledWith(stubFuncB, url)
})
_

_console.log_経由でfuncAが正しいURLを生成していることを確認しましたが、エラー_AssertError: expected funcB to be called with arguments_が発生します。 stubFuncB.getCall(0).argsを呼び出そうとすると、nullが出力されます。したがって、async/awaitについての理解が不足しているのかもしれませんが、その関数呼び出しにURLが渡されない理由がわかりません。

ありがとう

7
Alex Cauthen

あなたのfuncs宣言は正しくないと思います。 SinonはスタブできませんでしたgetRoute53およびfuncBfuncA内で呼び出されます。これを試してください。

funcs.js

const funcs = {
  getRoute53: () => 'not important',
  funcA: async (id) => {
    let url = funcs.getRoute53() + id
    return await funcs.funcB(url);
  },
  funcB: async () => null
}

module.exports = funcs

tests.js

describe('funcs', () => {
  let sandbox = null;

  beforeEach(() => {
    sandbox = sinon.createSandbox();
  })

  afterEach(() => {
    sandbox.restore()
  })


  it ('Should create a valid url and test to see if funcB was called with the correct args', async () => {
    const stubRoute53 = sandbox.stub(funcs, 'getRoute53').returns('https://sample-route53.com/');
    const stubFuncB = sandbox.stub(funcs, 'funcB').resolves('Not interested in the output');

    await funcs.funcA('1234');

    sinon.assert.calledWith(stubFuncB, 'https://sample-route53.com/1234')
  })
})

P.S.また、サンドボックスを使用します。スタブを掃除する方が簡単です

11