测试生成器函数有奇怪的行为

问题描述 投票:-1回答:1

我发现了一个奇怪的行为,它与测试生成器函数有关。我猜它背后有一个原因,但我不知道是什么。这是我的代码:

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++)

我确信它与模拟无关,因为我一直在进行更改以试图了解发生了什么,但我仍然找不到任何理由。有谁知道这是怎么回事?如果是这样,我该如何测试这样的功能呢?谢谢!

python generator pytest yield
1个回答
0
投票

调用client.baz()创建一个生成器。在您开始迭代它们之前,生成器不会执行任何代码。

client.baz()更改为next(client.baz()),您的测试将通过。

© www.soinside.com 2019 - 2024. All rights reserved.