В модульном тестировании, как проверить функцию, имеющую параметры объекта? - PullRequest
0 голосов
/ 07 декабря 2018

При модульном тестировании нужно ли отправлять полный реалистичный параметр объекта?Или вы просто отправляете параметр объекта, содержащий свойства, которые необходимы для функции?

Например, вот пример функции, которая требует модульного теста:

    function ChangeName(person) {
      if (person !== null) {
        let {firstName} = person.firstName;
        firstName = firstName + '_firstName';
        person.firstName = firstName;
        return person;
      }
      return person;
    }

Вот пример теста, которыйотправляет полный объект:

    expect(
      ChangeName(
        {
          firstName: 'Juan', 
          lastName: 'dela Cruz', 
          age: 22, 
          gender: 'Male', 
          aboutMe: 'About_Me', 
          schools:[
            {id: 1, name: 'School Name 1'},
            {id: 1, name: 'School Name 1'},
            {id: 1, name: 'School Name 1'},
            {id: 1, name: 'School Name 1'}
          ]
        }
      )
    ).toEqual(
      {
        firstName: 'Juan_firstName', 
        lastName: 'dela Cruz', 
        age: 22, 
        gender: 'Male', 
        aboutMe: 'About_Me', 
        schools:[
          {id: 1, name: 'School Name 1'},
          {id: 1, name: 'School Name 1'},
          {id: 1, name: 'School Name 1'},
          {id: 1, name: 'School Name 1'}
        ]
      }
    );

Вот пример теста отправляет объект, свойства которого необходимы только для функции (включая lastName, только для образца):

    expect(
      ChangeName(
        {
          firstName: 'Juan', 
          lastName: 'dela Cruz', 
        }
      )
    ).toEqual(
      {
        firstName: 'Juan_firstName', 
        lastName: 'dela Cruz', 
      }
    );

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я предоставляю проверяемый код только с тем, что необходимо.

В вашем случае это будет означать:

expect(changeName({ 
    firstName: 'Juan',
    lastName: 'dela Cruz'
}).toEqual({ 
    firstName: 'Juan_firstName',
    lastName: 'dela Cruz'
});

Почему?

  • Меньше работыпри рефакторинге объекта person
  • Тесты более читабельны, у вас есть только то, что относится к тесту
  • С набором символов утки и / или функциональным программированием вы можете повторно использовать эту функцию на других объектах (домашних животных…)
  • lastName (или любое другое имя) объясняет, что ничто другое не должно измениться

Это, вероятно, изменится, если вы используете печатание (flow, typcript).


Также я заметил несколько ошибок, которые могут вас беспокоить:

let { firstName } = person;

Вам не нужно повторять firstName

const newPerson = {
    ...person,
    firstName: firstName + '_firstName'
}
return newPerson;

Таким образом, вы этого не делаетемутировать исходный объект персонажа, который может быть вредным в React.

0 голосов
/ 07 декабря 2018

Это зависит от гарантий, которые вы хотите, чтобы ваш тест предоставил.

В вашем примере, если вы хотите проверить только то, что "свойство firstName обновлено, как ожидается", { firstName: 'Juan' } - этоправильный уровень сложности для аргумента, передаваемого в функцию changeName.

Однако, если гарантии, которые должен предоставить ваш тест, на самом деле - свойство firstName обновляется, как ожидается, и ничегоиначе следует изменить", становится важным иметь полный объект, представляющий тип данных, которые должна обрабатывать функция.

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

// buildPerson() creates a new, complete 'person' object when called,
// and overrides its properties with the provided ones
expect(
  changeName(buildPerson({ firstName: 'Juan' }))
).toEqual(
  buildPerson({ firstName: 'Juan_firstName' })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...