编写依赖函数的单元测试



我有一个函数,它询问用户语音的性别,然后读取该语音中的文本。如果用户输入不是男性或女性,则会引发值错误。我想为这个函数写一个单元测试,但不知道该怎么做。

def pdftospeech(n):
readersvoice = input("Voice: ").lower().strip()
voices = engine.getProperty("voices")
if readersvoice == "female":
engine.setProperty("voice", voices[1].id)
elif readersvoice == "male":
engine.setProperty("voice", voices[0].id)
else:
raise ValueError("Choose from male or female")
engine.setProperty("rate", 150)
rate = engine.getProperty("rate")
engine.say(n)
engine.runAndWait()

我的建议是将询问和检查输入与获取和设置引擎属性分开。

例如:

def ask_voice():
readers_voice = input("Voice: ").lower().strip()
if readers_voice not in ["female", "male"]:
raise ValueError("Choose from male or female")
return readers_voice
def read_with_voice(n, readers_voice):
voices = engine.getProperty("voices")
if readers_voice == "female":
engine.setProperty("voice", voices[1].id)
elif readers_voice == "male":
engine.setProperty("voice", voices[0].id)
engine.setProperty("rate", 150)
rate = engine.getProperty("rate")
engine.say(n)
engine.runAndWait()
def pdftospeech(n):
readers_voice = ask_voice()
read_with_voice(n, readers_voice)

ask_voice的测试则更为简单:

import unittest
from unittest import mock

def ask_voice():
readers_voice = input("Voice: ").lower().strip()
if readers_voice not in ["female", "male"]:
raise ValueError("Choose from male or female")
return readers_voice

class Test101(unittest.TestCase):
def test_ask_male(self):
with mock.patch('builtins.input', return_value="MaLe"):
self.assertEqual('male', ask_voice())
def test_ask_female(self):
with mock.patch('builtins.input', return_value="FeMaLe"):
self.assertEqual('female', ask_voice())
def test_ask_fail(self):
with mock.patch('builtins.input', return_value="mail"):
self.assertRaises(ValueError, ask_voice)

if __name__ == '__main__':
unittest.main(verbosity=2)

该测试给出以下输出:

test_ask_fail (__main__.Test101) ... ok
test_ask_female (__main__.Test101) ... ok
test_ask_male (__main__.Test101) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK

最新更新