Сравнить объекты, содержащие анонимные функции, на jest testcase - PullRequest
3 голосов
/ 21 марта 2019

Я использую шутку в проекте ReactNative.Я хотел бы сравнить в тестовом примере два объекта одного класса.Вот пример определения класса:

class Person {
    constructor(id, name, lastName) {
        this.id = id;
        this.name = name;
        this.lastName = lastName;
    }       

    fullName = () => {
        return `${this.name} ${this.lastName}`;
    }
}

Я создал тестовый пример, который сравнил два объекта класса Person, которые должны быть идентичны:

test('checks the Person.constructor method', () => {
    expect(new Person(1, 'John', 'Smith')).toEqual(new Person(1, 'John', 'Smith'));
});

Однако я получаю следующеерезультат:

 FAIL  __tests__/Comparison-test.js (7.328s)
  ● checks the Person.constructor method

    expect(received).toEqual(expected)

    Expected: {"fullName": [Function anonymous], "id": 1, "lastName": "Smith", "name": "John"}
    Received: {"fullName": [Function anonymous], "id": 1, "lastName": "Smith", "name": "John"}

      48 | 
      49 | test('checks the Person.constructor method', () => {
    > 50 |     expect(new Person(1, 'John', 'Smith')).toEqual(new Person(1, 'John', 'Smith'));
         |                                            ^
      51 | });

      at Object.toEqual (__tests__/Comparison-test.js:50:44)

Сравнивая ожидаемые и полученные значения, визуально я вижу, что они идентичны, однако я знаю, что они не считаются идентичными из-за анонимной функции fullName.

Как я могу сравнить оба объекта?Я хотел бы иметь возможность отключить анонимные функции, даже если функция идентична в обоих объектах.

Я попытался использовать функцию expect, установив lastName в expect.anything().Тест, приведенный ниже, фактически прошел:

test('checks the Person.constructor method', () => {
    expect(new Person(1, 'John', 'Smith')).toEqual({
        id: 1,
        name: 'John',
        lastName: 'Smith',
        fullName: expect.anything()});
});

Однако это не очень желательно, потому что мне пришлось бы перечислить все функции тестируемого класса, и, если я добавлю больше функций в класс, все его тестысломается.

Итак, есть ли способ сравнить два объекта одного и того же класса в jest, игнорируя все функции этих объектов?

Спасибо!

1 Ответ

4 голосов
/ 22 марта 2019

Звучит так, как вы хотите toMatchObject, что соответствует «подмножеству свойств объекта»:

test('checks the Person.constructor method', () => {
  expect(new Person(1, 'John', 'Smith')).toMatchObject({
    id: 1,
    name: 'John',
    lastName: 'Smith'
  });  // Success!
});

Обновление

ОП спросил в комментариях, есть ли способ по-прежнему использовать экземпляры.

Он также работает для сериализации объектов с использованием JSON.stringify и сравнения результатов:

test('checks the Person.constructor method', () => {
  expect(JSON.stringify(new Person(1, 'John', 'Smith')))
    .toBe(JSON.stringify(new Person(1, 'John', 'Smith')));  // Success!
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...