Как проверить метод класса, который принимает входные данные? - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня есть метод класса, который запрашивает размер группы с помощью пользовательского ввода;

def set_group_size(self):
    valid_input = False
    while not valid_input:
        response = input('Group Size: ')
        if isinstance(response, int):
            self.group_size = response
            valid_input = True

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

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

Ответы [ 2 ]

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

Измените код, чтобы сделать его более тестируемым (и просто попытайтесь превратить response в int вместо того, чтобы проверить, удастся ли int(response) успешно).

def set_group_size(self, input=input):
    while True:
        response = input('Group Size: ')
        try:
            self.group_size = int(response)
            break
        except ValueError:
            pass  # Try again

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

def make_input(stream):
    def _(prompt):
        return next(stream).rstrip("\n")
    return _

def test_it_chooses_group_size(self):
    my_input = make_input(stringio.StringIO("foo\nbar\n3")
    self.together.set_group_size(my_input)
    assert self.together.group_size == 3

def test_no_int_received(self):
    my_bad_input = make_input(stringio.StringIO("foo\n")
    old_group_size = self.together.group_size
    try:
        self.together.set_group_size(my_bad_input)
    except StopIteration:
        assert True  # Expected outcome, since input contains no int
    else:
        # This shouldn't be reachable; set_group_size has to
        # either terminate upon seeing an `int`, run forever, or raise
        # an uncaught StopIteration exception.
        assert False

Единственное, что не проверяет, это если set_group_sizeдаст вам неограниченные шансы для ввода целого числа, но в любом случае это не проверяемое свойство.

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

Похоже, у меня были другие проблемы с самим методом (входные данные были строкой, поэтому условие никогда не выполнялось), но в итоге я заставил его работать так, как я ожидал;

def set_group_size(self):
    valid_input = False
    while not valid_input:
        r = input('Group Size: ')
        if r.isdigit():
            self.group_size = int(r)
            valid_input = True
        else:
            print('Please enter a valid number')

Тест:

def test_it_chooses_group_size(self):
    with mock.patch('builtins.input', return_value='6'):
        self.together.set_group_size()
        assert self.together.group_size == 6
        assert type(self.together.group_size) == int
...