Python 卡在模拟输入上
所以,我想写一个罗马数字转换器。以前从未使用过unittest测试,但以下是我到目前为止所做的。我只是想测试“DLXII”的值是562。它只在主程序中运行find。但是,每次我尝试使用(python-m unittest test_roman_numbers)进行测试时,它只是运行程序,我必须为测试输入“DLXII”,除非测试是这样工作的。我试着让测试函数自动为我做这件事。谢谢 罗马数字.pyPython 卡在模拟输入上,python,mocking,python-unittest,roman-numerals,Python,Mocking,Python Unittest,Roman Numerals,所以,我想写一个罗马数字转换器。以前从未使用过unittest测试,但以下是我到目前为止所做的。我只是想测试“DLXII”的值是562。它只在主程序中运行find。但是,每次我尝试使用(python-m unittest test_roman_numbers)进行测试时,它只是运行程序,我必须为测试输入“DLXII”,除非测试是这样工作的。我试着让测试函数自动为我做这件事。谢谢 罗马数字.py class RomanNumeral: """A class to represent our ro
class RomanNumeral:
"""A class to represent our roman numerals or integers."""
def __init__(self, number):
"""Initializes the user's input, a counter, and standard values for each roman numeral."""
self.number = number
self.int_num = 0 # counter
self.rom_dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
def roman_to_int(self): # Probably better to use a linked list here.
"""Takes in user_input in roman numerals and return the equivalent integer."""
rom_values = list(self.rom_dict.items())
for i in range(len(self.number) - 1):
for j in range(len(rom_values)):
if self.number[i] == rom_values[j][0]:
self.int_num += rom_values[j][1]
for k in range(j+1, len(rom_values)):
if self.number[i+1] == rom_values[k][0]:
self.int_num -= 2*rom_values[j][1]
for l in range(len(rom_values)):
if self.number[-1] == rom_values[l][0]:
self.int_num += rom_values[l][1]
return self.int_num
def isroman(self):
"""Checks if user input is a roman numeral."""
for i in self.number:
if i not in self.rom_dict.keys():
return False
return True
def roman_or_int(self):
"""Checks if user input is a roman numeral, integer, or not."""
if self.IXC_triple_rules() is True:
return False
elif self.isroman():
print(self.roman_to_int())
elif self.number.isdigit():
print("number")
else:
print("Entry is neither roman numerals or integers.")
def IXC_triple_rules(self):
"""Tag if user input has more than 3 I, X, or C."""
if "IIII" in self.number or "XXXX" in self.number or "CCCC" in self.number:
print("You cannot have more than three I, X, or Cs in a row")
return True
def non_subtractive_numberals(self):
"""Tag for V, L, and D. Can never be subtracted."""
user_input = input("Enter a number in roman numerals: ")
x = RomanNumeral(user_input)
x.roman_or_int()
import unittest
from unittest.mock import patch
from roman_numerals import RomanNumeral
class TestRomanNumerals(unittest.TestCase): #sublcass of test case class
"""A test class for our Roman numerals."""
@patch('builtins.input', return_value="DLXII")
def test_roman_to_int(self, mock_input):
result = RomanNumeral("DLXII").roman_to_int()
self.assertEqual(result, 562)
测试罗马数字.py
class RomanNumeral:
"""A class to represent our roman numerals or integers."""
def __init__(self, number):
"""Initializes the user's input, a counter, and standard values for each roman numeral."""
self.number = number
self.int_num = 0 # counter
self.rom_dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
def roman_to_int(self): # Probably better to use a linked list here.
"""Takes in user_input in roman numerals and return the equivalent integer."""
rom_values = list(self.rom_dict.items())
for i in range(len(self.number) - 1):
for j in range(len(rom_values)):
if self.number[i] == rom_values[j][0]:
self.int_num += rom_values[j][1]
for k in range(j+1, len(rom_values)):
if self.number[i+1] == rom_values[k][0]:
self.int_num -= 2*rom_values[j][1]
for l in range(len(rom_values)):
if self.number[-1] == rom_values[l][0]:
self.int_num += rom_values[l][1]
return self.int_num
def isroman(self):
"""Checks if user input is a roman numeral."""
for i in self.number:
if i not in self.rom_dict.keys():
return False
return True
def roman_or_int(self):
"""Checks if user input is a roman numeral, integer, or not."""
if self.IXC_triple_rules() is True:
return False
elif self.isroman():
print(self.roman_to_int())
elif self.number.isdigit():
print("number")
else:
print("Entry is neither roman numerals or integers.")
def IXC_triple_rules(self):
"""Tag if user input has more than 3 I, X, or C."""
if "IIII" in self.number or "XXXX" in self.number or "CCCC" in self.number:
print("You cannot have more than three I, X, or Cs in a row")
return True
def non_subtractive_numberals(self):
"""Tag for V, L, and D. Can never be subtracted."""
user_input = input("Enter a number in roman numerals: ")
x = RomanNumeral(user_input)
x.roman_or_int()
import unittest
from unittest.mock import patch
from roman_numerals import RomanNumeral
class TestRomanNumerals(unittest.TestCase): #sublcass of test case class
"""A test class for our Roman numerals."""
@patch('builtins.input', return_value="DLXII")
def test_roman_to_int(self, mock_input):
result = RomanNumeral("DLXII").roman_to_int()
self.assertEqual(result, 562)
您需要将顶级代码放在
\uuuuu main\uuuu
块下,否则每次导入文件(包括在测试中)时都会执行该代码:
我知道这和while循环有关。只是不知道顶级代码如何与unittest一起工作。谢谢。