如何测试是否在 python 的方法中调用了另一个类方法?



我有以下结构:

ClassB():
def foo():
Class A():
def __init__(self, B):
#some initialisations
def method1():
#complex logic
B.foo()

我正在尝试编写一个单元测试方法1,并想测试foo是否被调用一次。 我怎样才能做到这一点?我应该嘲笑什么?

已编辑

根据OP提供的进一步信息,对答案进行了重新设计。

法典

下面的代码已经在 CentOS 8 上的 Python3.8.3 进行了本地测试。运行python3 -m unittest以查看测试结果。

功能代码(sub.py(:

class B():                                                                                                                                                                                                         
def foo(self):                                                                                                                                                                                                 
pass                                                                                                                                                                                                       
                                                                                                                                             
                                                                                                                                             
class A():                                                                                                                                                                                                         
def __init__(self, B):                                                                                                                                                                                         
self.b = B                                                                                                                                                                                                 
                                                                                                                                             
def method1(self):                                                                                                                                                                                             
self.b.foo()

测试代码(test.py(:

from unittest import TestCase                                                                                                                                                                                      
from unittest.mock import patch                                                                                                                                                                                    
                                                                                                                                             
from sub import A, B                                                                                                                                                                                               
                                                                                                                                             
                                                                                                                                             
class Test(TestCase):                                                                                                                                                                                              
def test_A(self):                                                                                                                                                                                              
with patch('sub.B.foo') as mock_foo:                                                                                                                                                                       
a = A(B)                                                                                                                                                                                               
a.method1()                                                                                                                                                                                            
mock_foo.assert_called_once()

基本上,测试代码尝试模拟B.foo方法,并在调用该方法时检查该方法是否被调用A.method1一次。

测试说明

  1. a = A(B)线路不调用B.foo
  2. a.method1()线路呼叫B.foo

总的来说,B.foo只被调用一次,所以mock_foo.assert_called_once()会通过。如果上述任何参数被证明无效,则断言将失败。如果您只需要检查B.foo是否至少被调用过一次,请改用mock_foo.assert_called()

有关模拟系统的详细信息,我建议阅读官方文档。

你应该为B创建一个 Mock,将其传递给A的构造函数并检查该函数是否被调用过一次。

您可以自己编写模拟。 例如:

class B_Mock():
def __init__(self):
self.foo_calls = 0
def foo(self):
self.foo_calls += 1

然后检查B_Mock实例的吸引力foo_callsassert

相关内容

  • 没有找到相关文章

最新更新