Как мне посмеяться над `csv.DictWriter.writeheader ()`, который вызывается из моей пользовательской функции? - PullRequest
1 голос
/ 18 октября 2019

У меня есть пользовательская функция, определенная в

custom_file.py


import csv

def write_dict_to_csv(columns=None, file_name=None, data=None):
    try:
        with open(file_name, "w") as f:
            writer = csv.DictWriter(f, fieldnames=columns)
            writer.writeheader()

в test_file.py Я хочу вернуть фиксированнуюзначение, когда вызывается writer.writeheader().

from custom_file import write_dict_to_csv

class TestMyFunctions(unittest.TestCase):

    @patch('custom_file.csv.DictWriter.writeheader')
    def test_write_dict_to_csv(self, mock_writeheader):
        custom_file.write_dict_to_csv(file_name='fileName')
        self.assertTrue(mock_writeheader.called)

Но это возвращает TypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType

Как мне высмеивать csv.DictWriter.writeheader(), когда он импортируется из внешней библиотеки в custom_file,который я затем тестирую из отдельного test_file?

Я подумал, что это будет близко к правильному, так как мы должны исправлять то, что ищется, а не то, где оно определено.

1 Ответ

2 голосов
/ 18 октября 2019

Код, который вы предоставили, не запускается "как есть" из-за отсутствия импорта, но после устранения проблем все кажется работающим (тест проходит). Вот код, который я запустил. Надеюсь, это поможет.

custom_file.py

import csv


def write_dict_to_csv(columns=None, file_name=None, data=None):
    with open(file_name, "w") as f:
        writer = csv.DictWriter(f, fieldnames=columns)
        writer.writeheader()

test_file.py

import unittest
from unittest.mock import patch

import custom_file


class TestMyFunctions(unittest.TestCase):

    @patch('custom_file.csv.DictWriter.writeheader')
    def test_write_dict_to_csv(self, mock_writeheader):
        print("Hello")
        custom_file.write_dict_to_csv(file_name='fileName')
        self.assertTrue(mock_writeheader.called)
...