Jest - восстановить исходную моментную функцию за один тест - PullRequest
1 голос
/ 06 мая 2020

Как восстановить или реализовать mock за один тест? У меня есть функция:

const parser = (data)=>{
    const now = moment().format('DD-MM-YYYY');

    //more implementation

    const parsedDate = moment(dateFromData).format('DD-MM-YYYY')

    return {
        date: isDateFromDataExists ? now : parsedDate
    }

}

А теперь я хочу протестировать свою функцию. Когда isDateFromDataExists истинно, я хотел бы вернуть текущий год (который следует высмеивать), но когда isDateFromDataExists ложно, я хотел бы вернуть parsedDate. Когда я издевался глобально

jest.mock('moment', () => () => ({format: () => '01-01-2020'}));

Я не могу «разблокировать» в одном тесте.

Как я могу сделать это с помощью Jest?

=== = EDIT ====

Это мой код.

const myParser = (single) => {
  const obj = {};

  const now = moment().format("DD-MM-YYYY");

  obj.availableFrom = get(single, 'FreeFrom', '') !== '' ? moment(get(single, 'FreeFrom'), 'YYYY-MM-DD').format("DD-MM-YYYY") : now;

   return obj;
}

Это мои тесты

test('Return correct json when FreeFrom is empty', async () => {
    const xmlData = fs.readFileSync(path.join(__dirname, './testData/1.xml'), 'utf8');
    var jsonObj = parser.parse(xmlData, options, true);

    const result = require('./testData/1.json');
    expect(myParser(jsonObj)).toEqual(result);
});

test('Return correct json when FreeFrom is available', async () => {
    const xmlData = fs.readFileSync(path.join(__dirname, './testData/2.xml'), 'utf8');
    var jsonObj = parser.parse(xmlData, options, true);

    const result = require('./testData/2.json');
    expect(myParser(jsonObj)).toEqual(result);
});

Мне нужно покрыть два тестовых примера.

  1. Когда FreeFrom не является пустой строкой, конвертируйте значение с моментом. Затем отформатируйте в мой формат.
  2. Когда FreeFrom является пустой строкой, используйте текущую дату с моментом. Затем отформатируйте в мой формат.

В случае 2. Я хотел бы имитировать текущую дату, чтобы сделать тесты независимыми от системной даты.

1 Ответ

1 голос
/ 06 мая 2020

Как предложено в комментариях проверьте связанный вопрос

Вот как вы могли бы это реализовать

let dateFromData = null;
let isDateFromDataExists = null;

const parser = (data) => {
  const now = moment().format('DD-MM-YYYY');

  const parsedDate = moment(dateFromData, 'DD-MM-YYYY').format('DD-MM-YYYY')

  return {
    date: isDateFromDataExists ? now : parsedDate
  }

}

const {
  core: {
    beforeEach,
    describe,
    it,
    expect,
    run
  },
} = window.jestLite;

describe("parser", () => {

  beforeEach(() => {
    const currentTimestamp = moment().valueOf();

    moment.now = jestLite.core.jest.fn().mockReturnValue(currentTimestamp);
  });

  it("return current date when isDateFromDataExists is true", () => {
    isDateFromDataExists = true;
    const currentDate = moment().format('DD-MM-YYYY');

    expect(parser().date).toBe(currentDate);
  });

  it("return parsed date when isDateFromDataExists is false", () => {
    isDateFromDataExists = false;
    dateFromData = "02-01-2003";
    expect(parser().date).toBe(dateFromData);
  });
});

run().then(result => {
  console.log(result);
})
<script src="https://unpkg.com/jest-lite@1.0.0-alpha.4/dist/core.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>
...