以下のようにcsvを扱っているコードがあるとする
/hoge/management/commands/example_command.py
import csv
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
with open(options['file'], 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
// 処理色々
この部分のテストコードを書きたい時、わざわざcsvファイルを用意して、っていうのはアレなのでmockでなんとかする必要がある
やり方は色々あるみたいだけれど、自分は以下のような感じでやってみた
/hoge/management/commands/tests/test_example_command.py
import io
from django.test import TestCase
from mock import patch
class ImportHogeHogeTest(TestCase):
@patch("hoge.management.commands.example_command.open", create=True)
def test_example_command(self, mock_open):
mock_open.return_value = io.StringIO(dummy_csv_1)
// テスト色々
dummy_csv_1 = """1,hoge,hoge_value
2,fuga,fuga_value
3,piyo,piyo_value
4,foo,foo_value
"""
上記のようにすると文字列が入った変数 dummy_csv_1
をcsvファイルとして、 with open
の返り値とすることができる。
このようにすると、/hoge/management/commands/example_command.py
の 処理色々
の部分で例えば print(row[2])
とするとhoge_value
が返ってくる