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

时间:2020-06-22 13:25:58

标签: python mocking python-unittest magicmock

我具有以下结构:

ClassB():
   def foo():

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

我正在尝试编写一个单元测试method1,并且想测试foo是否被调用一次。 我该如何实现?我该嘲笑什么?

2 个答案:

答案 0 :(得分:2)

已编辑

根据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()

有关模拟系统的详细信息,建议阅读the official docs

答案 1 :(得分:1)

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

您可以自己编写Mock。例如:

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

    def foo(self):
        self.foo_calls += 1

然后用foo_calls检查B_Mock实例的属性assert

相关问题