2016-05-10 6 views
1

私は自分のスクリプトに関数の単体テストを書いていますが、モックファイルの作成には問題があります。 私の関数はファイル名を取り、それの出力はmd5です。私はエラーを取得するしかしPython:unittestingのためにファイルを偽装する

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) 

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

はこのように、関連するモックMD5値とモックのファイルを作成するための正しい方法をされた時点での私のunittestの

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

? アドバイスありがとうございます!

+0

あなたは説明できます? これがあなたのmd5関数であれば、なぜfilenameの代わりにmockの引数で呼び出すのですか? –

+0

@AndreyBelyakこんにちは、これは、ファイルのディレクトリをスキャンし、各ファイル名とmd5値を含むマニフェストファイルを生成するより広いスクリプト内の関数です。私は自分のスクリプトで各関数の単体テストを作成中ですが、私の関数をテストするためにユニットテストのシナリオで単純なファイルを作成する方法があるのだろうかと思っていました – Catherine

+0

私は最も簡単な方法は、サンプルデータを含むファイル。テストフォルダ内に配置してvcsに追加することができます。 –

答えて

1

バイナリとしてread_dataを指定する必要がありますか?ここ あなたはファイルとユニットテストを実行するためにそれを貼り付けることができ、実施例である:

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') 

答えはその答えに基づいています:関数my_script.function_to_get_md5_value(m)が配置されている場所How do I mock an open used in a with statement (using the Mock framework in Python)?

+0

私は次のエラーを受け取りました "open(fname、" rb ")with f: IOError:[Errno 2]このファイルまたはディレクトリはありません: 'lalala'" 私は 'm'エラー: "TypeError:Unicodeに強制する:文字列またはバッファが必要、MagicMockが見つかりました" – Catherine

+0

IOErrorは、オープンコールが正しくパッチされていないことを意味します。 mock.patch( 'XXX.open'、...)を確認してください。XXXはあなたの機能を持つモジュール名でなければなりません。 –

関連する問題