#javascript #unit-testing #jasmine #stub
Вопрос:
Как мне имитировать запрос в этой функции. Я хочу провести модульное тестирование этой функции с помощью jasmine.
function getProducts() {
return new Promise((resolve, reject) => {
request.get(
{
url: 'http://ascott.com/products'
},
(err, response, body) => {
if (err) return reject(err);
const result = JSON.parse(body);
if(result.value =='yes') return resolve(1);
return resolve(0);
}
);
});
}
Ответ №1:
Используйте функцию spyOn(obj, methodName) для установки шпиона в request.get()
метод, затем используйте callFake(fn)
команду сообщить шпиону вызвать поддельную реализацию при вызове. Чтобы вы могли вызвать обратный вызов в поддельной реализации.
index.js
:
import request from 'request';
export function getProducts() {
return new Promise((resolve, reject) => {
request.get({ url: 'http://ascott.com/products' }, (err, response, body) => {
if (err) return reject(err);
const result = JSON.parse(body);
if (result.value == 'yes') return resolve(1);
return resolve(0);
});
});
}
index.test.js
:
import { getProducts } from '.';
import request from 'request';
describe('69769551', () => {
it('should return 1', async () => {
spyOn(request, 'get').and.callFake((_, callback) => {
callback(null, null, JSON.stringify({ value: 'yes' }));
});
const actual = await getProducts();
expect(actual).toEqual(1);
});
it('should throw error', async () => {
const mError = new Error('network');
spyOn(request, 'get').and.callFake((_, callback) => {
callback(mError);
});
await expectAsync(getProducts()).toBeRejectedWithError('network');
});
});
результат теста:
Executing 2 defined specs...
Running in random order... (seed: 04537)
Test Suites amp; Specs:
1. 69769551
✔ should throw error (7ms)
✔ should return 1 (1ms)
>> Done!
Summary:
👊 Passed
Suites: 1 of 1
Specs: 2 of 2
Expects: 2 (0 failures)
Finished in 0.017 seconds
версии пакетов:
"jasmine": "^3.6.3"
"request": "^2.88.2"