Шинон Шпион никогда не звонил, но это должно быть - PullRequest
0 голосов
/ 13 февраля 2019

Проблема

Я тестирую пользовательское промежуточное программное обеспечение для редуксов, используя Jest и SinonJS, а точнее хочу проверить, не вызваны ли некоторые функции в специальных условиях внутри промежуточного программного обеспечения.

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

Код

Вот промежуточное ПО, которое я хочу протестировать:

import { Cookies } from 'react-cookie';
import setAuthorizationToken from './setAuthorizationToken';

let cookies = new Cookies();

export const bindTokenWithApp = (store) => (next) => (action) => {
    // Select the token before action
    const previousToken = getToken(store.getState());
    // Dispatch action
    const result = next(action);
    // Select the token after dispatched action
    const nextToken = getToken(store.getState());

    if (previousToken !== nextToken) {
        if (nextToken === '') {
            setAuthorizationToken(false);
            cookies.remove(SESSION_COOKIE_NAME, COOKIE_OPTIONS);
        } else {
            cookies.set(SESSION_COOKIE_NAME, nextToken, COOKIE_OPTIONS);
            setAuthorizationToken(nextToken);
        }
    }

    return result;
};

Вот мой реальный тест

import { bindTokenWithApp } from './middleware';
import { Cookies } from 'react-cookie';
import sinon, { assert } from 'sinon';
import setAuthorizationToken from './setAuthorizationToken';

describe('bindTokenWithApp', () => {
    const next = jest.fn();
    const action = jest.fn();
    let cookies = new Cookies();

    it('removes cookies when there is no token', () => {
        // My actual not working spies
        const cookieSpy = sinon.spy(cookies.remove);
        const authSpy = sinon.spy(setAuthorizationToken);

        // Stub for the specific case. This code works, 
        // I console.logged in the middleware and I'm getting the below values
        const getState = sinon.stub();
        getState.onFirstCall().returns({ auth: { token: 'a token' } });
        getState.onSecondCall().returns({ auth: { token: '' } });
        const store = { getState: getState };

        bindTokenWithApp(store)(next)(action);

        assert.calledOnce(cookieSpy);
        assert.calledOnce(authSpy);
        // Output : AssertError: expected remove to be called once but was called 0 times
        // AssertError: expected setAuthorizationToken to be called once but was called 0 times

        cookieSpy.restore(); // <= This one works
        authSpy.restore(); // TypeError: authSpy.restore is not a function 

  });
});

Я прочитал документацию SinonJS и несколько сообщений StackOverFlow, но без решений.Я также не могу позвонить authSpy.restore();.Я думаю, что не правильно инициализирую шпионов, и я неправильно понимаю концепцию в SinonJS, но не могу найти какую!

Сигнатура setAuthorizationToken
(псевдоним) const setAuthorizationToken:(токен: любой) => void
import setAuthorizationToken

Я думаю, что это классический модуль, поэтому я не могу понять, почему я борюсь с authSpy.restore();

1 Ответ

0 голосов
/ 13 февраля 2019

У двух шпионов на самом деле есть два разных исправления, оба с одной и той же основной проблемой.sinon.spy(someFunction) на самом деле не оборачивает someFunction сам, он возвращает шпиона для него, но не выполняет никакой замены.

Для первого шпиона существует сокращение для автоматической обертки метода объекта: sinon.spy(cookie, 'remove') должен делать то, что вам нужно.

Для второго шпиона это сложнее, так как вам нужно обернуть шпиона вокруг экспорта по умолчанию setAuthorizationToken.Для этого вам понадобится что-то вроде proxyquire.Proxyquire - это специальный механизм запросов, который позволяет вам заменить импорт желаемыми методами тестирования.Вот краткое описание того, что вам нужно сделать:

const authSpy = sinon.spy(setAuthorizationToken);
bindTokenWithApp = proxyquire('./middleware', { './setAuthorizationToken': authSpy});
...