2016-05-10 2 views
1

Ich schreibe einen Komponententest für eine Funktion in meinem Skript, aber ich habe Probleme beim Erstellen einer Mock-Datei. Meine Funktion nimmt einen Dateinamen und Ausgabe ist es MD5-Wert.Python: Mocking eine Datei für UnitTesting

def md5(file_name): 
    #Function to return the md5 value of a file 
    hash_md5 = hashlib.md5() 
    with open(fname, "rb") as f: 
     for chunk in iter(lambda: f.read(4096), b""): 
      hash_md5.update(chunk) 
    return hash_md5.hexdigest() 

Mein Unittest zur Zeit:

import mock 
class Function_to_test_TestCase(unittest.TestCase): 

    def test_filename(self): 
     with mock.patch('__main__.open', mock.mock_open(read_data=''), create=True) as m: 
      md5_value=my_script.function_to_get_md5_value(m) 

Jedoch habe ich den Fehler:

with open(fname, "rb") as f: 
TypeError: coercing to Unicode: need string or buffer, MagicMock found 

ist dieser Weg der richtige Weg, ein Mock-Datei mit einem ähnlichen Mock md5 Wert zu machen ? Jeder Rat wird geschätzt!

+0

Können Sie erklären, wo Funktion my_script.function_to_get_md5_value (m) ? Wenn dies Ihre MD5-Funktion ist, warum nennen Sie es mit Mock-Argument anstelle von Dateiname? –

+0

@AndreyBelyak Hallo, es ist eine Funktion in einem breiteren Skript, das ein Verzeichnis von Dateien scannt und eine Manifest-Datei erzeugt, die jeden Dateinamen und jeden md5-Wert enthält. Ich bin gerade dabei, Komponententests für jede Funktion in meinem Skript zu erstellen, ich habe mich nur gefragt, ob es eine Möglichkeit gibt, eine einfache Datei in einem Unittest-Szenario zu erstellen, um meine Funktion – Catherine

+0

zu testen. Ich denke, dass der einfachste Weg ist, real zu verwenden Datei mit Beispieldaten. Sie können es in Ihren Testordner einfügen und zu VCS hinzufügen. –

Antwort

1

Darf man read_data als Binärdatei angeben? Hier ist ein funktionierendes Beispiel, können Sie es einfügen, um Datei und starten Sie mit Unittest:

import hashlib 
from unittest import TestCase 

import mock 


def md5(file_name): 
    hash_md5 = hashlib.md5() 
    with open(file_name, "rb") as f: 
     for chunk in iter(lambda: f.read(4096), b""): 
      hash_md5.update(chunk) 
    return hash_md5.hexdigest() 


class MD5TestCase(TestCase): 
    def test(self): 
     with mock.patch('%s.open' % __name__, mock.mock_open(read_data=b'aaa'), create=True) as m: 
      result = md5("lalala") 
      self.assertEqual(result, '47bce5c74f589f4867dbd57e9ca9f808') 

Die Antwort auf diese Antwort basiert: How do I mock an open used in a with statement (using the Mock framework in Python)?

+0

Ich schein den folgenden Fehler "mit offenem (fname," rb ") als f zu erhalten: IOError: [Errno 2] keine solche Datei oder Verzeichnis: 'lalala'" wenn ich 'm' verwende, bekomme ich die Fehler: "TypeError: zu Unicode erzwingen: brauche String oder Puffer, MagicMock gefunden" – Catherine

+0

IOError bedeutet, dass offener Anruf nicht richtig gepatcht ist. Überprüfen Sie mock.patch ('XXX.open', ...) XXX sollte Modulname mit Ihrer Funktion sein. –