簡體   English   中英

pytest 模擬來自不同模塊的 class

[英]pytest mock class from different module

我試圖模擬一個 class ,它在我試圖測試的 class 的構造函數中實例化。 如果我定義 class 我試圖在與我嘗試測試的模塊相同的模塊中進行模擬,一切正常,但是當它們位於單獨的模塊中時,我會出錯。

這是我的示例,取自此處(請注意,在我的實際示例中,測試 class 位於“測試”子模塊中,其他兩個文件位於“app.src.code ...”模塊中。

我錯過了什么?

助手.py:

import os

class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

工人.py:

from helper import Helper

class Worker:    
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py:

import unittest
from unittest.mock import patch
from worker import Worker


class WorkerTest(unittest.TestCase):
    def test_patching_class(self):
        with patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            MockHelper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')

您需要使用補丁裝飾器為helper.py模塊的Helper class 創建模擬。

例如

helper.py

import os


class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

worker.py

from helper import Helper


class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py

import unittest
from unittest.mock import patch
from worker import Worker


class TestWorker(unittest.TestCase):
    def test_work(self):
        with patch('worker.Helper') as mock_Helper:
            mock_helper_instance = mock_Helper.return_value
            mock_helper_instance.get_path.return_value = 'testing'
            worker = Worker()
            mock_Helper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')


if __name__ == '__main__':
    unittest.main()

帶有覆蓋率報告的單元測試結果:

Working on testing
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                        Stmts   Miss  Cover   Missing
-------------------------------------------------------------------------
src/stackoverflow/61008064/helper.py            7      3    57%   6, 9-10
src/stackoverflow/61008064/test_worker.py      13      0   100%
src/stackoverflow/61008064/worker.py            8      0   100%
-------------------------------------------------------------------------
TOTAL                                          28      3    89%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM