可以模仿lambda表达式吗?

2024-05-14 18:07:12 发布

您现在位置:Python中文网/ 问答频道 /正文

前两个函数display_pane_1和{}很容易测试 在方法test_1中。我想把这两个函数重构成一个函数display_pane_2。在

在lambdademo.py公司名称:

def display_pane_1():
    display_register(template_1)


def template_1():
    return 'hello mum'


def display_pane_2():
    display_register(lambda: 'hello mum')


def display_register(template):
    print(template())

试验_lambdademo.py在

^{pr2}$

你能帮我为display_pane_2写一个有效的测试吗?我想测试完整的lambda表达式,即lambda x: 'hell mum'应该失败。在

我试过两种方法来解决问题。在

第一个选项是test_1的简单副本,将lambdademo.template_1的参数替换为lambda的模拟。我在手册中找不到任何建议我应该如何模仿lambda这样的表达式。 如果在手册里,请告诉我在哪里。在

我的第二个选择是从更广泛的搜索堆栈溢出和互联网。“python expression unittest”缺少响应命中, “python lambda unittest”、“python expression mock”或“python lambda mock” 暗示我可能问错了问题。我认为我需要嘲笑lambda表达式的假设是错误的吗?在

我知道一个简单的编码解决方案是保留原始代码,但在这一点上,我更感兴趣的是填补我的知识空白。在


Tags: 方法lambda函数pytestregisterhello表达式
1条回答
网友
1楼 · 发布于 2024-05-14 18:07:12

如果lambda表达式可以在某个地方访问,比如类或模块的属性,那么您可以模仿它,但这似乎不太可能。通常,在不需要引用函数时使用lambda表达式。否则,只需使用一个正则函数。在

但是,您可以检索模拟对象上所有调用的参数,因此可以查看传入的lambda表达式。在您给出的示例中,最简单的方法就是调用lambda表达式并查看它返回什么。在

from mock import patch

def foo(bar):
    return bar()

def baz():
    return 42

print foo(baz)

with patch('__main__.foo') as mock_foo:
    print foo(baz)
    print foo(lambda: 'six by nine')

    assert mock_foo.call_args_list[0][0][0]() == 42
    assert mock_foo.call_args_list[1][0][0]() == 'six by nine'

如果出于某种原因您不想这样做,那么可以使用inspect模块查看lambda表达式。下面是一个仅转储定义函数的源代码行的示例:

^{pr2}$

结果:

42
<MagicMock name='foo()' id='140595519812048'>
<MagicMock name='foo()' id='140595519812048'>
[call(<function baz at 0x7fdef208fc08>),
 call(<function <lambda> at 0x7fdef208fe60>)]
 -
def baz():
    return 42

 -
    print foo(lambda: 'six by nine')

下面是测试的一个版本,它与示例代码一起通过。它测试两种方式:调用模板和检查模板的源代码。在

# test_lambdademo.py

from inspect import getsource
import unittest
import unittest.mock as mock

import lambdademo


class TestLambda1(unittest.TestCase):
    def setUp(self):
        p = mock.patch('lambdademo.display_register')
        self.mock_display_register = p.start()
        self.addCleanup(p.stop)

    def test_1(self):
        lambdademo.display_pane_1()
        self.mock_display_register.assert_called_with(lambdademo.template_1)

    def test_2(self):
        lambdademo.display_pane_2()
        template = self.mock_display_register.call_args[0][0]
        template_content = template()
        template_source = getsource(template)

        self.assertEqual('hello mum', template_content)
        self.assertIn('hello mum', template_source)

相关问题 更多 >

    热门问题