Как вы тестируете функцию Typescript в Жасмин? - PullRequest
0 голосов
/ 09 ноября 2019

Это прямой вопрос, но я не могу найти ответ. Документация по Жасмин может быть улучшена. В первую очередь показаны примеры слежки за фиктивными данными и функциями, но я хочу протестировать написанную мной функцию. Иначе, что я на самом деле тестирую? Когда я работал с Pipes, я обнаружил, что это намного проще, так как все, что мне нужно сделать, это создать канал с новым ключевым словом. А потом утверждают, что он возвращает то, что я ожидаю. например,

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.

Что мне здесь не хватает? Как я могу вызвать свою функцию в моем тесте без необходимости ее создания?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Ошибки жасмина могут быть обманчивыми. Очевидно, проблема была в методе .toHaveBeenCalled().

Когда я обновил свой макет и использовал .toEqual() и .not.toBeNull(), он прошел.

describe('getKeyValueOfAttributesFromElement', () => {
let mockData;
it('should return null', () => {
    mockData = {
        attributes: {
            a: {
                nodename: 'something',
                value: 'a value'
            }
        }
    };

    expect(getKeyValueOfAttributesFromElement(mockData)).not.toBeNull();

});

it('should return attributes', () => {
    mockData = {
        attributes: {
            a: {
                nodename: 'something',
                value: 'a value'
            }
        }
    };
    expect(getKeyValueOfAttributesFromElement(mockData)).toEqual({'undefined': 'a value'});

});

it('should return invalid output', () => {
    mockData = {
        attributes: {
            a: {
                nodename: 'something',
                value: 'a value'
            },
            b: {
                name: false,
                value: ''
            }
        }
    };

    expect(getKeyValueOfAttributesFromElement(mockData)).toEqual({'undefined': ''});


});
});
0 голосов
/ 09 ноября 2019

Ну, getKeyValueOfAttributesFromElement не шпион, и это то, что говорит Жасмин. toHaveBeenCalled метод может применяться только к шпионскому объекту Жасмин. myFunc является результатом выполнения, но не шпионом.

Сначала необходимо заглушить функцию getKeyValueOfAttributesFromElement, но оказывается, что очень сложно создать шпион независимой экспортируемой функции (см. обсуждение github ).

Я бы рекомендовал вообще не проверять toHaveBeenCalled, потому что это не имеет никакого смысла. Обычно вы используете toHaveBeenCalled на зависимостях для тестирования вашей функции изолированно, но не на исходной функции, которую вы только что вызвали. Просто сравните результат с различными наборами данных, и в этом случае это будет 100% правильный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...