Sinon: заглушка метода оболочки, который использует API выборки, и этот метод вызывается внутри основной функции в веб-компонентах
У меня есть метод-оболочка для fetchapi, который возвращает обещание. См. Пример кода ниже:
const fetchWrapper = (url , opts) => {
const fetchPromise = fetch(url, opts);
const wrapper = new Promise((resolve, reject) => {
fetchPromise
.then((response) => {
if (response.status === 400 && response.headers.get('Content-Type') === 'application/json') {
response.json()
.then((data) => {
if (!data.success) {
resolve(new Promise(() => {}));
} else {
resolve(response);
}
})
.catch(() => resolve(response));
} else {
resolve(response);
}
},
reject);
});
return wrapper;
Итак, теперь у меня есть метод, в котором я вызываю этот метод fetchWrapper, как показано ниже:
async loadData() {
const response = await fetchWrapper('/sample-template.json');
const json = await response.json();
this.reportTypes = json.templates;
}
Вопрос в том, что я хочу провести модульное тестирование этого метода loadData. Итак, я пытаюсь заглушить внутренний метод, используя приведенный ниже код модульного теста.
const MOCK_JSON = {
templates: [{"id": 1,"name": "Sample report 1"}, {"id": 2,"name": "Sample report 2"}]
};
const jsonOk = (body) => {
const mockResponse = new window.Response(JSON.stringify(body), {
status: 200,
headers: {
'Content-type': 'application/json',
},
});
return Promise.resolve(mockResponse);
};
describe('load data api', async () => {
let stub;
beforeEach(() => {
stub = sinon.stub(fetchWrapper);
stub.onCall(0).returns(jsonOk(MOCK_JSON));
console.log(stub.calledOnce);
});
afterEach(() => {
stub.restore();
});
it('load all report types', async () => {
const res = loadData();
});
});
Пожалуйста, дайте мне знать, каким может быть решение для проведения модульного теста. Я пробовал несколько способов, но не нашел подходящего решения. Помощь.