测试生成器函数有奇怪的行为
Testing a generator function has weird behavior
我发现了一个奇怪的行为,它与测试生成器函数有关。我想这背后是有原因的,但我不明白是什么。这是我的代码:
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())
,您的测试将通过。
我发现了一个奇怪的行为,它与测试生成器函数有关。我想这背后是有原因的,但我不明白是什么。这是我的代码:
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())
,您的测试将通过。