Как имитировать запрос в jasmine

#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"