Макет строки. Формат в жасмине

Я пытаюсь написать модульные тесты для мобильного приложения, разработанного в Appcelerator titanium. Я пытаюсь провести модульное тестирование с помощью TiUnit и Jasmine.

Один из моих методов использует String.format(). Как выполнить модульное тестирование этого метода, поскольку String.format() не определен в Javascript?

function MyMethod(_flag, _myProperty, _propertyValue) {
if (_flag) {
  _myProperty = String.format('The value :', _propertyValue);
  }
}

Можно ли поиздеваться над этим? Или я могу добавить format () к прототипу jasmine String, чтобы всякий раз, когда он встречает format () в .js, который нужно протестировать, он запускал format (), который я определю в наборе тестов?

Я не знаком со средой, String.format() импортирован в файл, где он используется? Можете ли вы поделиться исходным кодом, который пытаетесь протестировать?

Brian Adams 16.08.2018 03:25

Он определен во фреймворке глобально, он не определен ни в одном пространстве имен, поэтому я не могу понять, как это имитировать. Я обновил вопрос примером. Вот документация: docs.appcelerator.com/platform/latest/#!/api/Global.String

Katana 16.08.2018 16:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
525
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Способ обойти эту проблему - сделать это чистая функция.

В качестве примера возьмем это небольшое изменение:

function MyMethod(_flag, _myProperty, _propertyValue, formatFunction) {
  if (_flag) {
    _myProperty = formatFunction('The value :', _propertyValue);
  }
}

Теперь MyMethod не зависит от чего-либо внешнего по отношению к функции. Это позволяет вам использовать любое средство форматирования строк, которое вы хотите, а в вашем случае - имитацию.

В вашем тесте теперь у вас есть возможность сделать что-то вроде этого:

it('should format the string', () => {
  const mockFormatter = () => {/*do the mock operation of your choosing here*/}
  const formattedString = MyMethod(yourFlag, yourProperty, yourPropertyValue, mockFormatter)
  assert(formattedString, expectedOutput)
})

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

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

Я думаю, что насмешка над String.format() привносит излишнюю сложность в тест без какого-либо реального повышения достоверности кода.

** Обновлено: я предположил, что String.format() - это функция JS, о которой я не слышал, но, похоже, это не так.

Чтобы достичь того, что вам нужно, и избежать необходимости полностью высмеивать, я думаю, вам следует использовать интерполяцию строк с помощью строковых литералов или конкатенацию.

Глянь сюда:

function MyMethod(_flag, _myProperty, _propertyValue) {
  if (_flag) {
    _myProperty = `The value : ${_propertyValue}`; // option 1 uses interpolation
    // _myProperty = 'The value : ' + _propertyValue; // option 2 uses concatenation
  }
}

Причина, по которой я подумал о насмешке, заключается в том, что когда я запускаю тест, я получаю сообщение об ошибке от жасмина «String.format ()» не является функцией », поскольку он не является частью стандартного JS.

Katana 16.08.2018 17:46

Ах! Я понимаю, как глупо с моей стороны. Я понимаю что ты имеешь ввиду. Существует ли он в каком-либо контексте, в котором вы будете его запускать? Чтобы избежать использования String.format() вместе и использовать JS, вы можете использовать _myProperty = The value: $ {_ propertyValue} `(обратите внимание на использование обратных тиков, а не одинарных кавычек, поскольку вы хотите интерполяцию строк). Я обновлю свой пост, чтобы отразить это.

cgdibble 16.08.2018 18:28

Другие вопросы по теме