No soy un experto pero voy a darle una oportunidad . Primero un poco de refactorización: hacerlos funcionales (eliminar todo lo de la clase), eliminar cosas innecesarias. Esto debería hacer que sea mucho más fácil de probar. Siempre puede hacer que la clase llame a estas funciones si realmente lo desea en una clase.
def pass_file_name(base_filename, exists):
"""return a list of filenames that exist
based upon `base_filename`.
use `os.path.isfile` for `exists`"""
log_files = []
if exists(base_filename):
log_files.append(base_filename)
for i in range(1, 8):
filename = base_filename + "." + str(i)
if exists(filename):
log_files.append(filename)
return log_files
def read_log_files (self, log_files):
"""read and parse each line from log_files
use `pass_file_name` for `log_files`"""
log_entrys = []
for filename in log_files:
with open(filename) as myfile:
for line in myfile:
log_entrys.append(line.split())
return log_entrys
Ahora podemos probar fácilmente pass_file_name
mediante introducción de una función personalizada para exists
.
class Test_pass_file_name(unittest.TestCase):
def test_1(self):
"""assume every file exists
make sure all logs file are there"""
exists = lambda _: True
log_files = pass_file_name("a", exists)
self.assertEqual(log_files,
["a", "a.1", "a.2", "a.3",
"a.4", "a.5", "a.6", "a.7"])
def test_2(self):
"""assume no files exists
make sure nothing returned"""
exists = lambda _: False
log_files = pass_file_name("a", exists)
self.assertEqual(log_files, [])
# ...more tests here ...
Como suponemos os.path.isfile
obras que debería haber conseguido bastante bien las pruebas de la primera función. Aunque siempre puede hacer que la prueba cree realmente algunos archivos, llame al pass_file_name
con exists = os.path.isfile
.
El segundo es más difícil de probar; Me han dicho que las mejores pruebas (de unidad) no tocan la red, las bases de datos, la GUI o el disco duro. Así que tal vez un poco más de refactorización lo haría más fácil. La burla abierta podría funcionar; o que en realidad podría escribir algún archivo largo en la función de prueba y leerlos en.
How do I mock an open used in a with statement (using the Mock framework in Python)?
"... para que pueda tomar el nombre del archivo o el objeto similar a un archivo" ¿Cómo hago eso? Compruebe por ejemplo de str (un nombre de archivo), de lo contrario, suponga que es un objeto IO? – Symmitchry