首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在另一个文件中修补类和方法

无法在另一个文件中修补类和方法
EN

Stack Overflow用户
提问于 2020-05-13 21:41:28
回答 2查看 505关注 0票数 0

我一直把头撞在墙上这样的小模型上:

这棵树是:

代码语言:javascript
复制
src
├── __init__.py
├── file_a.py
├── file_b.py


test
├── test_a.py

在file_a中:

代码语言:javascript
复制
class qaz(object):
    def __init__(self):
        print("\n\nin qaz")

    def exec_bar(self):
        bar_inst = bar()
        bar_inst.execute("a", "b")

在file_b中:

代码语言:javascript
复制
class bar(object):
    def __init__(self, a, b):
        print("\n\nin bar")

    def execute(self, c, d):
        print("\n\nin bar -> execute")

因此,我想模拟bar,这样我就可以在没有任何问题的情况下测试a

在test_a中:

代码语言:javascript
复制
from unittest.mock import patch, MagicMock
from src.file_a import qaz
from src.file_b import bar

class BarTester(unittest.TestCase):

    @patch('src.file_b.bar')
    def test_bar(self, mock_bar):
        bar_inst = MagicMock()
        bar_inst.execute.return_value = None
        mock_bar.return_value = bar_inst

        q = qaz()
        q.exec_bar()

这种情况每次都会失败:

代码语言:javascript
复制
TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'

这意味着模拟不起作用。我似乎找不出我做错了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 22:12:40

在file_b中,您期望在"init“中传递两个参数。

def __init__(self, a, b):

但是在file_a中,当您为类栏创建对象时,不传递任何参数。

bar_inst = bar()

这就是为什么你看到了错误

TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'

你做了两件事:

def __init__(self, a, b):

  • Pass

中删除参数a和b时

新解决方案:

代码语言:javascript
复制
from mock import patch
import unittest
from src.file_a import qaz
from src.file_b import bar

class BarTester(unittest.TestCase):

    @patch.object(bar, '__init__', return_value=None)
    def test_bar(self, *mock_stdout):
        q = qaz()
        q.exec_bar()
票数 1
EN

Stack Overflow用户

发布于 2020-05-14 00:45:21

赛拉姆解决了这个问题,但是想把代码发出来供以后参考。最终测试结果是这样的;

从unittest.mock导入修补程序,MagicMock从src.file_a导入qaz从src.file_b导入栏

代码语言:javascript
复制
class BarTester(unittest.TestCase):

    @patch.object(bar, '__init__', return_value=None)
    @patch.object(bar, 'execute', return_value=None)
    def test_bar(self, *mock_bar):
        q = qaz()
        q.exec_bar()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61785358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档