2014-10-18 2 views
0

Я относительно новичок в модульном тестировании. Я пишу небольшую библиотеку JavaScript, где я определил приоритет дружественного API, что приводит к некоторому перекрытию метода для удобства использования.Как я могу выполнить единый тестовый код с большим совпадением?

В качестве простого, гипотетического примера, рассмотрим следующее:

var BasicMath = function() {}; 

BasicMath.prototype.multiply = function(numA, numB) { 
    return numA * numB; 
}; 

BasicMath.prototype.square = function(num) { 
    return this.multiply(num, num); 
}; 

Как я должен модульного тестирования этого кода?

Отметьте, что .square() - это просто удобный метод, который ничего не делает, а передает его аргумент дважды в .multiply().

Имея это в виду, я должен:

  • написать аналогичные (или даже идентичных) модульных тестов для обоих методов?
  • проверить, что .square() вызывает .multiply() с определенными аргументами? (Я понимаю, что это плохая практика, так как она слишком сильно зависит от деталей реализации метода.)
  • не тест .square() вообще, так как он по существу избыточен до .multiply()?
  • проверить только более общие аспекты .square() (например, тип аргумента, количество и т. Д.), Чтобы избежать избыточности с помощью .multiply()?

Или, другой подход?

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

ответ

0

Пример использования жасмин и Sinon:

тест Multiply, как и любой другой метод:

it('multiplies two numbers', function() { 
    math = new BasicMath(); 
    expect(math.multiply(2,3)).toBe(6); 
} 

с square, вы хотите проверить, что он вызывает multiply передавая в качестве обоих аргументов значение num и возвращает результат, возвращаемый multiply, без выполнения какой-либо другой логики:

it('squares a number', function() { 
    math = new BasicMath(); 
    math.multiply = sinon.stub(); 
    math.multiply.withArgs(2,2).returns(4); 

    expect(math.square(2)).toBe(4); 
} 

, что вы делаете с этим, создайте воспроизводимую среду с помощью заглушки, которая всегда будет ожидать, что вызов будет с двумя идентичными аргументами (в данном случае 2 и 2), который проверяет, что квадрат отправляет num и num (а не num и num + 1, например), и возвращает результат вызова умножать (вы можете сказать окурок вернуться 'banana' и проверить 'banana', что важно square возвращает то multiply возвращает)

Смежные вопросы