首页 > 解决方案 > 你如何在 Jasmine 中测试一个 Typescript 函数?

问题描述

这是一个直截了当的问题,但我找不到答案。Jasmine 文档可以改进。它主要显示了监视模拟数据和函数的示例,但我想测试我编写的函数。否则,我实际上在测试什么?当我使用 Pipes 时,我发现它更加直接,因为我所要做的就是使用 new 关键字实例化管道。然后断言它返回我所期望的。例如

const test = pipe.transform('8726324632');

expect(test).toEqual('872-632-4632');`

但是,功能似乎不起作用。采取以下代码:

export function getKeyValueOfAttributesFromElement(el) {
    const attributeMap = {};
    Object.keys(el.attributes)
        .forEach(key => {
            attributeMap[el.attributes[key].nodeName] = el.attributes[key].value;
        });

    return attributeMap;
};

// 我的测试

import { getKeyValueOfAttributesFromElement } from './dom';


describe('getKeyValueOfAttributesFromElement', () => {
    let mockData;

    beforeEach(() => {
        mockData = {
            attributes: {
                a: 'somestring',
                b: 42,
                c: false
            }
        };
    });

    it('should work', () => {

        const myFunc = getKeyValueOfAttributesFromElement(mockData);

        expect(myFunc).toHaveBeenCalled();
    });
});

而不是这种传递,我在浏览器中收到以下错误expected a Spy, but got ({ undefined: undefined }).)

new如果我用关键字 调用函数,我会得到Only a void function can be called with the 'new' keyword.

我在这里想念什么?我怎样才能在我的测试中调用我的函数而不必编造一个?

标签: typescriptunit-testingjasmine

解决方案


好吧,getKeyValueOfAttributesFromElement不是间谍,这就是 Jasmine 所说的。toHaveBeenCalled方法只能应用于 Jasmine 间谍对象。myFunc是执行的结果,但不是间谍。

您必须先存根您的getKeyValueOfAttributesFromElement函数,但事实证明创建一个独立导出函数的间谍非常棘手(请参阅 github 讨论)。

我建议根本不要检查toHaveBeenCalled,因为它没有任何意义。您通常使用toHaveBeenCalled依赖项来单独测试您的函数,而不是您刚刚调用的原始函数。只需针对不同的数据集测试结果,在这种情况下这将是 100% 正确的方法。


推荐阅读