Я пытаюсь написать модульные тесты для мобильного приложения, разработанного в 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 (), который я определю в наборе тестов?
Он определен во фреймворке глобально, он не определен ни в одном пространстве имен, поэтому я не могу понять, как это имитировать. Я обновил вопрос примером. Вот документация: docs.appcelerator.com/platform/latest/#!/api/Global.String



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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