2017-07-18 14 views
0

以下の関数が開き、Jsonファイルが読み込まれます。私の質問は、それをテストする最良の方法は何ですか?ユニットテスト機能を使用してjsonファイルを開く方法は?

def read_file_data(filename, path): 
    os.chdir(path) 
    with open(filename, encoding="utf8") as data_file: 
     json_data = json.load(data_file) 
    return json_data 

filenamepathはsys.argvの年代として渡されます。私は私が実際に

class TestMyFunctions(unittest.TestCase): 
    def test_read_file_data(self): 
     sample_json = { 
         'name' : 'John', 
         'shares' : 100, 
         'price' : 1230.23 
         } 

どれでもポインタを機能をテストするためにそれを使用する方法がわから開始のための私のテストケースのサンプルデータが必要ではないだろうと考え出し

が理解されるであろう。

+0

'self.assertEqual(sample_json、read_file_data(ファイル名、パス))'すべてのコードの – DeepSpace

+0

まずのみ標準PythonライブラリのAPIへの呼び出しを行っています。そのコードはすでにテストされており、再度テストするべきではありません。独自のコードをテストするだけです。第2に、関数はコードの外部にあるリソース(ファイル)の使用を伴います。単体テストでは通常、それらのリソースを模擬します。 [記事](https://www.toptal.com/python/an-introduction-to-mocking-in-python)はあなたにいくつかのアイデアを与えるかもしれません –

答えて

0

あなたがしたいことは、JSONファイルを作成し、そのJSONファイルのメモリバージョンをハードコードし、その2つのファイルの間で等しいファイルをアサートすることです。あなたのコードに基づいて

:も述べたように、ハードコーディングされたファイルを作成することによって、あなたはポイントを破っているよう

class TestMyFunctions(unittest.TestCase): 
    def test_read_file_data(self): 
     import json 
     sample_json = { 
         'name' : 'John', 
         'shares' : 100, 
         'price' : 1230.23 
         } 
     sample_json = json.dump(sample_json, ensure_ascii=False) 
     path = /path/to/file 
     filename = testcase.json 
     self.assertEqual(read_file_data(filename, path), sample_json) 
+0

@ Jeremy Barnes、ありがとう。どのパスとファイル名が指しているかを明確にすることはできますか?外部jsonファイルを参照する場合、sample_jsonのポイントは何ですか? – Darth

+0

サンプルJSONは、外部jsonファイル内のデータのハードコードされたバージョンです。それらはread_file_data関数の適切な操作を保証するために比較されます。 これは 'self.assertEqual'呼び出しのためのものです。 私の経験では、テストは一般的に、特定の状況と特定の入力が、プログラムからの特定の出力または応答のうちの1つだけをもたらすテストケースを作成しています。 JSONファイルを作成してコードに再作成し、目的のJSONファイルが返されることを確認します。 追加の明瞭性を求めていただきありがとうございます。 –

0

あなたの上に述べたように、標準のPythonライブラリのコードが正しく動作し再テストする必要はありません。あなたのコードユニットの外側でテストすることによってユニットテストを行います。

代わりに、pythons mockingフレームワークを使用してファイルのオープニングを模擬するのが正しい方法です。そして、関数が正しく読み込まれたjsonを返すかどうかテストします。

from unittest.mock import patch, mock_open 
import json 

class TestMyFunctions(unittest.TestCase): 


@patch("builtins.open", new_callable=mock_open, 
     read_data=json.dumps({'name' : 'John','shares' : 100, 
         'price' : 1230.23})) 
def test_read_file_data(self): 
    expected_output = { 
        'name' : 'John', 
        'shares' : 100, 
        'price' : 1230.23 
        } 
    filename = 'example.json' 
    actual_output = read_file_data(filename, 'example/path') 

    # Assert filename is file that is opened 
    mock_file.assert_called_with(filename) 

    self.assertEqual(expected_output, actual_output) 
関連する問題