Как я могу издеваться над запросом функции, когда я пытаюсь проверить метод - PullRequest
0 голосов
/ 11 марта 2019

// user.dal

У меня есть эти два метода в user.dal, и я пытаюсь проверить method1, но у него есть запрос внутри с именем function1 (я хочу подделать результат этого) Я использую sinon.stub

export async function function1(id) {
      try {
        const result1 = await User.findOne({ _id: id });
        return result1;
      } catch (error) {
        throw new Error('invalid user');
      }
    }

export async function method1(id, date) {
  const request1 = await function1(id); // this is not faking its results
  const request2 = await function2(request1); // this need to fake the results also
  return request2;
}

// user.test

describe.only('get all information ', () => {
    const id = '5c842bd3cf058d36711c6a9e';
    const user = {
      _id: '5c76f49e6df2131fe23a100a',
    };
    const date = '2019-03-09';
    let spyFunction1;
    beforeEach(async () => {
      spyFunction1 = sinon.stub(userDal, 'function1').returns('this is my result');
    });

    afterEach(async () => {
      await userModel.deleteOne({ _id: id });
      spyFunction1.restore();
    });

    it('Should get.', async () => {
      const result = await userDal.function1(id);
      console.log('this is working well', result);

      const badResult = await userDal.method1(id, date);
      console.log('-->>>', badResult); // when its call to method 1, its calling to the method and not using the mock that I impemented before
    });
  });

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Из import doc :

Статический оператор import используется для импорта привязок, которые экспортируются другим модулем.

Таким образом, когда вы делаете это:

import * as userDal from './user.dal';

, в результате userDal содержит привязки ко всему, что экспортируется модулем user.dal.


Затем, когда вы делаете это:

sinon.stub(userDal, 'function1').returns('this is my result');

привязка function1 заменена на stub, который возвращает 'this is my result'.

Другими словами, экспорт модуля для function1 былзаменен заглушкой .


Поэтому, когда эта строка запускается:

const result = await userDal.function1(id);

, она вызывает экспорт модуля для function1 (которыйбыл задан), поэтому результат будет 'this is my result'.


С другой стороны, когда эта строка запускается:

const badResult = await userDal.method1(id, date);

она вводит method1, которая затем запускает эту строку:

const request1 = await function1(id); // this is not faking its results

, который не вызывает экспорт модуля для function1, он вызывает function1 напрямую .


Чтобы иметь возможность заглушить function1 и function2 в method1 вы должны вызывать их экспорт модулей вместо того, чтобы вызывать их напрямую.


Для Node.js модуля шаблон выглядит следующим образом:

const function1 = async function (id) { /* ... */ }
const function2 = async function (id) { /* ... */ }

const method1 = async function (id, date) {
  const request1 = await exports.function1(id);  // call the module export
  const request2 = await exports.function2(request1);  // call the module export
  return request2;
}

exports.function1 = function1;
exports.function2 = function2;
exports.method1 = method1;

Для модуля ES6 схема аналогична.Обратите внимание, что «Модули ES6 поддерживают циклические зависимости автоматически» , поэтому мы можем import модуль вернуться в себя , чтобы получить доступ к экспорту модуля:

import * as userDal from 'user.dal';  // import module into itself

export async function function1(id) { /* ... */ }
export async function function2(id) { /* ... */ }

export async function method1(id, date) {
  const request1 = await userDal.function1(id);  // call the module export
  const request2 = await userDal.function2(request1);  // call the module export
  return request2;
}

Если вы следуете этому шаблону и вызываете модуль экспорта для function1 и function2 изнутри method1, то при замене модуля экспорта для этих двух функций на заглушки,заглушки будут вызываться, когда вы звоните method1.

0 голосов
/ 11 марта 2019

Я думаю, вы должны сделать подпись метода следующим образом: method1(id, date, function1, function2). По сути, вы бы передавали функцию 1 как параметр. Затем в своем тесте вы можете вместо этого передать имитированную функцию или заглушку, чтобы иметь возможность проверить ее.

export async function function1(id) {
      try {
        const result1 = await User.findOne({ _id: id });
        return result1;
      } catch (error) {
        throw new Error('invalid user');
      }
    }

export async function method1(id, date, function1, function2) {
  const request1 = await function1(id); 
  const request2 = await function2(request1);
  return request2;
}
...