Во-первых, у вас слишком много кода в блоке try
.Единственное, что там вызывает ValueError
(что точно указано в вашем сообщении об ошибке), это вызов int
в первой строке.Во-вторых, не кодируйте input
в коде, который вы планируете тестировать;вместо этого передайте второй аргумент, который по умолчанию - input
, но позволяет вам предоставить детерминированную функцию для тестирования.
def add_member(self, input=input):
p_name = input("Enter your project name: ")
participant_names = []
roles = []
while True:
try:
many = int(input("How many member do you want to add? "))
break
except ValueError:
print("Enter an integer")
for i in range(many):
name = input("Enter name: ")
role = input("Enter role: ")
participant_names.append(name)
roles.append(role)
self.notebook.add_member(p_name, participant_names, roles)
def make_input(stream):
def _(prompt):
return next(stream)
return _
def test_add_member():
x = Foo()
x.add_member(make_input(["Manhattan", "0"])
# assert that x.notebook has 0 participants and roles
x = Foo()
x.add_member(make_input(["Omega", "ten", "2", "bob", "documentation", "alice", "code"]))
# assert that self.notebook has bob and alice in the expected roles
Тем не менее, еще лучше код, запрашивающий вводвероятно, должен быть полностью отделен от метода this, который должен просто брать имя проекта и набор участников и их роли (, а не два отдельных списка).Этот набор может быть списком кортежей или диктовкой, но это должно быть то, что не допускает несоответствия между именами каждого участника и их ролями.
def add_member(self, name, participants):
self.notebook.add(name, [x[0] for x in participants], [x[1] for x in participants])
def test_add_member():
x = Foo()
x.add_member("Manhattan", [("bob", "documentation"), ("alice", "code")])
# same assertion as before