Как мне провести модульное тестирование этой функции, чтобы избежать бизнес логики c и тавтологий? - PullRequest
0 голосов
/ 28 апреля 2020

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

Примечание: это python, и я использую unittest библиотека из python

SOME_CONSTANT = "constant"

def foo(a, b, c):
  arg1 = "something-{}".format(a)
  arg2 = {
    "p1": b + 1,
    "p2": SOME_CONSTANT,
  }
  arg3 = c
  bar(arg1, arg2, arg3)

def bar(arg1, arg2, arg3):
  pass

Предполагая, что bar уже проверен модулем, я могу высмеять bar в моем foo модульном тесте, когда я проверяю foo.

Мой текущий модульный тест для этого выглядит следующим образом

@patch(bar) # this mocks the bar function
def test_foo(mock_bar):
  a = 1
  b = 2
  c = 3
  foo(a, b, c)

  arg1 = "something-{}".format(a)
  arg2 = {
    "p1": b + 1,
    "p2": SOME_CONSTANT
  }
  arg3 = c
  mock_bar.assert_called_with(arg1, arg2, arg3)

Это не правильно, так как я копирую logi c в модульный тест. Есть ли лучший способ для модульного тестирования этого?

1 Ответ

0 голосов
/ 28 апреля 2020

По сути, вы должны проверить, если foo способен генерировать правильный набор выходных значений - arg1, arg2 и arg3 из входных значений - a, b и c.

Итак, предполагая

a = 'good'  
b = 9  
c = 'blah'  
SOME_CONSTANT = 9999  

, ваш юнит-тест будет

@patch(bar)
def test_foo(mock_bar):
    foo('good', 9, 'blah')
    mock_bar.assert_called_with('something-good', {"p1": 10, "p2": 9999}, 'blah')
...