我发现了一个奇怪的行为,它与测试生成器函数有关。我猜它背后有一个原因,但我不知道是什么。这是我的代码:
class Foo:
def foo_function(self):
return range(10)
class Client:
def __init__(self):
self.client = Foo()
def baz(self):
for i in self.client.foo_function():
yield i
这是我的考验:
from unittest.mock import patch
from django.test import TestCase
from my_app.my_module.client import Client
class ClientTestCase(TestCase):
@patch('my_app.my_module.client.Foo')
def test_baz(self, foo):
client = Client('')
client.baz()
foo().foo_function.assert_called_once()
当我运行这个测试时,我得到一个AssertionError
:
AssertionError: Expected 'foo_function' to have been called once. Called 0 times.
这可能只是我的错,但是一旦我尝试用pdb
进行调试,我就会看到奇怪的行为。如果我把痕迹放在foo_function
里面,我意识到它永远不会进入它里面。所以在调用它之前把它放在正确的位置,然后插入,给我一个GeneratorExit
并离开:
[28] > /app/my_app/my_module/tests/test_client.py(14)test_baz()
-> client.baz()
6 frames hidden (try 'help hidden_frames')
(Pdb++) step
--Call--
[29] > /app/my_app/my_module/client.py(11)foo_function()
-> def foo_function(self):
6 frames hidden (try 'help hidden_frames')
(Pdb++) next
GeneratorExit
[29] > /app/my_app/my_module/client.py(11)foo_function()
-> def foo_function(self):
6 frames hidden (try 'help hidden_frames')
(Pdb++)
我确信它与模拟无关,因为我一直在进行更改以试图了解发生了什么,但我仍然找不到任何理由。有谁知道这是怎么回事?如果是这样,我该如何测试这样的功能呢?谢谢!
调用client.baz()
创建一个生成器。在您开始迭代它们之前,生成器不会执行任何代码。
将client.baz()
更改为next(client.baz())
,您的测试将通过。