Застрял на фиктивных входах - PullRequest
0 голосов
/ 06 мая 2020

Итак, я пытаюсь написать конвертер римских чисел. Никогда раньше не использовал модульные тесты, но вот что у меня есть. Я просто пытаюсь проверить значение «DLXII», равное 562. Он запускает только поиск в основной программе. Но каждый раз, когда я пытаюсь провести тест с (python -m unittest test_roman_numerals), он просто запускает программу, и мне нужно ввести «DLXII» для теста, если тест не работает так. Я пытался заставить функцию тестирования делать это автоматически. Спасибо.

roman_numerals.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()

test_roman_numerals.py

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)

1 Ответ

1 голос
/ 06 мая 2020

Вам нужно поместить свой код верхнего уровня в блок __main__, иначе он будет выполняться каждый раз, когда вы импортируете файл (в том числе в ваш тест):

if __name__ == '__main__':
    user_input = input("Enter a number in roman numerals: ")
    x = RomanNumeral(user_input)
    x.roman_or_int()
...