Sinon无法验证内部函数是否被调用过一次。

问题描述 投票:0回答:1

给定两个函数。

export const func1 = (accessKeyId, secretAccessKeyID, region, queue, body) =>
  new AWS.SQS({ accessKeyId, secretAccessKey: secretAccessKeyID, region })
    .sendMessage({ QueueUrl: queue, MessageBody: body })
    .promise();

export const func2 = (queue, body) => func1(config.key, config.secret, config.region, queue, body);

直接的函数。我想测试func2,并验证func1的调用是否正确,所以我有。

import { func1, func2 } from '../uploads';
import sinon from 'sinon';

describ('test 1', ()=> {
it('send job queue should send correct param to sendToSqs', async done => {
    const spy = sinon.spy(func2);
    const queue = 'test-queue';
    const topic = 'test-topic';
    const data = { field1: 'value1', field2: 'value2' };

    await func1(queue, topic, data);
    expect(spy.calledOnce).to.be.equal(true);
    done();
  });
});

运行上面的函数会出现错误

(node:29076) UnhandledPromiseRejectionWarning: UnknownEndpoint: Inaccessible host: `test-queue'. This service may not be available in the `us-east-1' region.

很明显,即使间谍被创建了,它仍然试图调用里面的函数。所以我觉得我这里有两个问题:1.这个 spy 似乎不相干 func2,我错过了什么?2.我也许应该嘲笑一下。func1 也是。但是mock只适用于对象内部的函数。我如何在没有父对象的情况下只模拟一个函数?

javascript testing mocha chai sinon
1个回答
1
投票

你不能在一个独立的函数上进行stubspy。而且 func1 内称 func2 原汁原味 func1,而不是存根版本。你需要做一些改变。

例如:

index.ts:

import AWS from 'aws-sdk';

const config = {
  key: 'key',
  secret: 'secret',
  region: 'region',
};

export const func1 = (accessKeyId, secretAccessKeyID, region, queue, body) =>
  new AWS.SQS({ accessKeyId, secretAccessKey: secretAccessKeyID, region })
    .sendMessage({ QueueUrl: queue, MessageBody: body })
    .promise();

export const func2 = (queue, body) => exports.func1(config.key, config.secret, config.region, queue, body);

index.test.ts:

import * as funcs from './';
import sinon from 'sinon';

describe('61964269', () => {
  it('should pass', async () => {
    const spy = sinon.stub(funcs, 'func1');
    const queue = 'test-queue';
    const topic = 'test-topic';
    const data = { field1: 'value1', field2: 'value2' };

    await funcs.func2(queue, data);
    sinon.assert.calledWithExactly(spy, 'key', 'secret', 'region', 'test-queue', {
      field1: 'value1',
      field2: 'value2',
    });
  });
});

我们使用 exports.func1import * as funcs from './',所以 func1 将被保存在一个对象中- module.exports 对象。然后,我们可以将 func1 在我们的测试文件中,当我们调用 func2.

单元测试的结果。

  61964269
    ✓ should pass


  1 passing (11ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   83.33 |      100 |      50 |      80 |                   
 index.ts |   83.33 |      100 |      50 |      80 | 10                
----------|---------|----------|---------|---------|-------------------
© www.soinside.com 2019 - 2024. All rights reserved.