Pregunta

Después de leer esto: ¿Cómo me burlo de un abierto usado en una declaración (usando el marco simulado en Python)?

Puedo burlarme de la función abierta en Python usando:

with patch(open_name, create=True) as mock_open:
    mock_open.return_value = MagicMock(spec=file)
    m_file = mock_open.return_value.__enter__.return_value
    m_file.read.return_value = 'text1'

    diffman = Diffman()
    diffman.diff(path1, path2)

Funciona bien cuando mi método probado usó una declaración abierta. Aquí está mi método probado:

def diff(self, a, b):
    with open(a, 'r') as old:
        with open(b, 'r') as new:
            oldtext = old.read()
            newtext = new.read()

Los valores de OldText y NewText son los mismos ('Text1' aquí).

Me gustaría tener 'Text1' para OldText y 'Text2' para NewText.

Cómo puedo hacer esto ?

¿Fue útil?

Solución

Aquí hay una forma rápida de obtener lo que quieres. Se trampa un poco porque los dos objetos de archivo en el método en prueba son el mismo objeto y solo estamos cambiando el valor de retorno de la llamada de lectura después de cada lectura. Puede usar la misma técnica en varias capas si desea que los objetos de archivo sean diferentes, pero será bastante desordenado y puede disfrazar la intención de la prueba innecesariamente.

Reemplace esta línea:

    m_file.read.return_value = 'text1'

con:

    reads = ['text1', 'text2']
    m_file.read.side_effect = lambda: reads.pop(0)

Otros consejos

Quizás una buena solución posible es escribir el código de una manera que se presta mejor para probarlo fácilmente. En el caso de 'diff', parece bastante fácil (no tener mucho otro contexto, es cierto) que Take Take como argumentos ya apertados objetos de archivo. Es probable que este sea un cambio bastante pequeño en el código, y hace que las pruebas sean muy fáciles, ya que puede proporcionar fácilmente objetos de archivo simulados a diff () cuando lo prueba, en lugar de tratar de saltar a través de los aros burlándose de dos instancias de las mismas las mismas Función construida como gerente de contexto llamado dentro ... o algo así ;-)

import StringIO

diff(a, b):
  oldtext = a.read()
  newtext = b.read()

def test_diff():
  a = StringIO.StringIO('text1')
  b = StringIO.StringIO('text2')

  res = diff(a, b)
  <some assertion here>

¿Funcionaría eso para su caso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top