- 我无法找到
builtins.print 的真正定义,但这是我要覆盖的方法:
class ViewSpy:
last_message = ""
def print(self, *args, sep=' ', end='\n'):
self.last_message = sep.join(map(str, args)) + end
根据布尔值更改v.print 的行为:
import builtins
# ... set should_unittest variable here
if should_unittest:
v = ViewSpy()
else:
v = builtins
v.print("nothing")
ViewSpy 的实现模拟了builtins.print,并将输出存储到一个字段中,以便我们可以自动测试它。
def test_view_spies():
v = ViewSpy()
v.print("nothing")
assert v.last_message == "nothing\n"
v.print("something")
assert v.last_message == "something\n"
v.print("John", "Smith")
assert v.last_message == "John Smith\n"
v.print("apples", 24, "grapes", "bananas", sep=',')
assert v.last_message == "apples,24,grapes,bananas\n"
v.print("Automated testing is fun", end='!!!')
assert v.last_message == "Automated testing is fun!!!"
v.print("Maybe, you don't need a new line", end='')
assert v.last_message == "Maybe, you don't need a new line"
- 给演示者
class Presenter:
def __init__(self, view):
self.view = view
def present_sentence(self, response_model):
self.view.print(*map(self.__convert_container_to_str, response_model))
@staticmethod
def __convert_container_to_str(each_character_as_array_element):
return "".join(each_character_as_array_element)
现在我们可以读取p.present_sentence 将发送到控制台的内容并自动对其进行测试
def test_present_sentence():
view = ViewSpy()
p = Presenter(view)
p.present_sentence(({'ь', 'е', 'с', 'Д', 'В', 'л', 'а'}, {'М', 'у', 'и', 'р', 'а', 'н'},
{'п', 'х', 'к', 'у', 'т', 'о', 'л', 'а', 'с'},
{'и', 'д', 'н', 'ч', 'у', 'з', 'ж', 'о', 'л', 'а', 'с'}, {'х', 'у', 'т', 'а', 'м'},
{'в', 'е', 'с'}, {'в', 'е', 'и', 'ж'}, {'в'}, {'х', 'т', 'i', 'а'}, {'в', 'о', 'з', 'н'},
{'и', 'л', 'ж', 'о'}, {'п', 'ь', 'и', 'р', 'н', 'к', 'у', 'о', 'л', 'с'},
{'ш', 'i', 'у', 'з', 'о', 'л', 'а', 'м'}, {'i', 'г', 'н', 'з', 'о', 'л', 'а', 'м'}))
printed_words = view.last_message.split()
first_word = view.last_message.split()[0]
assert len(printed_words) == 14
assert len(first_word) == 7
for letter in first_word:
assert letter in {'ь', 'е', 'с', 'Д', 'В', 'л', 'а'}
assert view.last_message[-1] == '\n'
assert view.last_message[13] != ' '
assert view.last_message[14] == ' '
assert view.last_message[15] != ' '
third_word = printed_words[2]
assert len(third_word) == 9
for letter in third_word:
assert letter in {'п', 'х', 'к', 'у', 'т', 'о', 'л', 'а', 'с'}
在__init__.py中,我们编写以下代码来实际将消息打印到控制台,并且不存储日志。
import builtins
#...
p = Presenter(builtins)