不调用存根函数,而是调用实际版本。为什么呢?

时间:2017-08-16 21:21:47

标签: unit-testing testing jasmine sinon stub

我试图测试一个调用连接到amazon AWS的其他两个函数的函数。考虑到这一点,我不想调用称为AWS的真实函数 - 我试图将它们存根。但是,每次运行我的测试时,它都会调用真正的函数而不是我的存根。

我对测试很陌生,可能会遗漏一些东西,但无法找到任何其他问题的解决方案。 我使用jasminesinon

我的代码如下:

const cache = new Map<string, Set<string>>();
//Function to be tested - inside class XYZ
export function functionToBeTest(events: Event[]): Promise<Event[]> {
    cache.clear();
    let promises: Array<Promise<void>> = [];
    promises = events.map((event) => {
        let foundId: string;
        return functionA(event.Id)
            .then((id: string) => {
                foundId = id;
                if (!cache.has(id)) {
                    return functionB(id);
                }
            })
            .then((regDev) => {
                cache.set(foundId, new Set(regDev));
            })
            .catch((err) => {
                log.error({ err: err });
                return Promise.reject(err);
            });
    });

    return Promise.all(promises)
        .then(() => {
            return Promise.resolve(events)
        });
}

我想要存根的功能:

export function functionA(id: string): Promise<string> {//Return Promise<string>
//some code
return anotherFunction(id);
}

export function functionB(organizationId: string): Promise<string[]> {
//Goes to amazon do something and return Promise<string[]>
}

我省略了functionAfunctionB的实现,因为我不关心他们做了什么,或者我只需要将它们存根,所以我在functionToBeTest内测试逻辑

我的测试套件如下:

import * as sinon from 'sinon';

describe('testing functionToBeTest()', () => {

    let stubA: sinon.SinonStub;
    let stubB: sinon.SinonStub;

    beforeEach(() => {
        stubA = sinon.stub(xyz, 'functionA');
        stubA.onFirstCall().resolves('1');
        stubA.onSecondCall().resolves('2');
        stubB = sinon.stub(xyz, 'functionB');
        stubB.onFirstCall().resolves(['1']);
        stubB.onSecondCall().resolves(['2']);
    });

    afterEach(() => {
        stubA.restore();
        stubB.restore();
    });

    it('should populate the cache', (done) => {
        let events: Event[] = [
            {
                timestamp: 1,
                eventType: EventType.PC,
                id: '1'
            },
            {
                timestamp: 2,
                eventType: EventType.BU,
                id: '2'
            }
        ];
        xyz.functionToBeTest(events)// Here should call the real function and inside it should call the stub functions
        .then((result) => {
            //expectations
        })
        .then(() => {
            done();
        })
        .catch((err) => {
            done.fail(err);
        });
    });
});

正如我所说,当我运行此测试时,它永远不会调用存根函数并始终从实际函数内部返回错误(应该是存根的)。

任何人都可以帮忙吗?我可能做错了但是我看不出有什么问题。

1 个答案:

答案 0 :(得分:0)

想出它是一个有问题的参考。它不是调用方法存根,而是调用真正的存根。要解决这个问题,我必须更改我的原始类导出它,并在我想在外面使用的方法上使用info sort