我具有以下结构:
ClassB():
def foo():
Class A():
def __init__(self, B):
#some initialisations
def method1():
#complex logic
B.foo()
我正在尝试编写一个单元测试method1,并且想测试foo是否被调用一次。 我该如何实现?我该嘲笑什么?
答案 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
时检查该方法是否已被精确调用。
a = A(B)
行未调用B.foo
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