Проблема
Я тестирую пользовательское промежуточное программное обеспечение для редуксов, используя 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();