Как мне заглушить не объектную функцию с помощью sinon - PullRequest
1 голос
/ 06 ноября 2019

У меня есть необъектная функция

в getConfig.js

export default function () {
 /** do something **/
  return {
    appConfig: { status: true } 
    }
}

и под моим основным файлом

import getConfig from './getConfig';

export default function() {
 const { appConfig } = getConfig();
 
 if(appConfig.status) {
   console.log("do the right thing");
   else {
   console.log("do other things")
   }
  }
 }

Как мне насмехаться над функцией getConfig, используя методы заглушки или заглушки sinon? или есть ли лучший способ установить свойство appConfig.status, чтобы сделать true или false?

Я хотел бы сделать следующее, но он не работает

import getConfig from './getConfig';
import main from './main';

test('should status to be true', () => {
  
  sinon.stub(getConfig).callsFake(sinon.fake.returns({status:true});
  expect(main()).toBe('to do the right thing')
}

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Функция getConfig просто возвращает объект, поэтому вам нужно просто проверить возвращаемое значение (объект.) Вам вообще не нужен sinon. Что вам нужно сделать, это подтвердить возвращаемое значение. Вы можете использовать mocha средство запуска тестов для запуска тестов и набор инструментов подтверждения, например, внутренний модуль assert узла для подтверждения.

", есть ли лучший способ установить свойство appConfig.statusсделать правду или ложь? Как насчет добавления аргумента в функцию?

// using default values for properties
export default function(status = true) {
  // no need for additional `appConfig` property
  return { status };
}

Тестирование (см. Руководство mocha по настройке среды):

import getConfig from './getConfig';
import assert from 'assert';

describe('getConfig', function() {
    it('should return { status: true } by default', function() {
      const ret = getConfig();
      assert.deepEqual(ret, { status: true });
    });
    it('should return { status: false } by passing `false`', function() {
      const ret = getConfig(false);
      assert.deepEqual(ret, { status: false });
    });
});
0 голосов
/ 06 ноября 2019

Хорошо, я нашел другое альтернативное решение, используя только JEST

jest.mock('./getConfig', () => (
 jest.fn()
 .mockReturnValueOnce({ appConfig: { status: true }})
 .mockReturnValueOnce({ appConfig: { status: false }})
))

//The getConfig get replaced with the above mock function

Таким образом, решение выглядит как

import main from './main';

jest.mock('./getConfig', () => (
 jest.fn()
 .mockReturnValueOnce({ appConfig: { status: true }})
 .mockReturnValueOnce({ appConfig: { status: false }})
))


test('should status to be true', () => {
  expect(main()).toBe('to do the right thing')
  expect(main()).toBe('to do the other things')
}
...