I am brand new to pytest and trying to work my way through it. I currently am programming a small CLI game which will require multiple user inputs in a row and I cannot figure out how I can do that. I read a bunch of solutions but did not manage to make it work.
Here is my code:
class Player:
def __init__(self):
self.set_player_name()
self.set_player_funds()
def set_player_name(self):
self.name = str(input("Player, what's you name?\n"))
def set_player_funds(self):
self.funds = int(input("How much money do you want?\n"))
I simply want to automate the user input for those two requests.
(ie: a test that would input "Bob" and test: assert player.name=="Bob"
Can someone help out with that? Thank you!
-
1Have you checked this?Samarth– Samarth2018年11月26日 16:56:19 +00:00Commented Nov 26, 2018 at 16:56
-
1I did, I couldn't figure out how it worked. But I mostly understood my program was poorly designed. I do not want to simulate a user input, I just want to select some specific inputs and test outcomes programmatically. Thanks for the help!Bertrand Chevalier– Bertrand Chevalier2018年11月27日 04:12:24 +00:00Commented Nov 27, 2018 at 4:12
1 Answer 1
Quite elegant way to test inputs is to mock input text by using monkeypatch fixture. To handle multiple inputs can be used lambda statement and iterator object.
def test_set_player_name(monkeypatch):
# provided inputs
name = 'Tranberd'
funds = 100
# creating iterator object
answers = iter([name, str(funds)])
# using lambda statement for mocking
monkeypatch.setattr('builtins.input', lambda name: next(answers))
player = Player()
assert player.name == name
assert player.funds == funds
monkeypatch on docs.pytest.org.
Iterator object on wiki.python.org.