lem*_*sss 4 python lambda unit-testing
前两个函数display_pane_1和template_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())
Run Code Online (Sandbox Code Playgroud)
test_lambdademo.py
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()
self.mock_display_register.assert_called_with('????????')
Run Code Online (Sandbox Code Playgroud)
你能帮我写一个有效的测试吗display_pane_2?我想测试完整的 lambda 表达式,即lambda x: 'hell mum'应该失败。
我尝试了两种解决方案。
第一个选项是 的简单副本,用 的模拟test_1替换 的参数。我在手册中找不到任何建议我应该如何模拟像 lambda 这样的表达式的内容。如果手册中有的话请告诉我在哪里。lambdademo.template_1lambda
我的第二个选择是在 Stack Overflow 和互联网上进行了更广泛的搜索。缺少“python 表达式单元测试”、“python lambda 单元测试”、“python 表达式模拟”或“python lambda 模拟”的响应点击表明我可能问了错误的问题。我需要模拟 lambda 表达式的假设是错误的吗?
我知道一个简单的编码解决方案是保留原始代码,但此时我更感兴趣的是填补我的知识空白。
如果 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'
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您不想这样做,那么您可以使用检查模块来查看 lambda 表达式。这是一个仅转储定义函数的源代码行的示例:
from inspect import getsource
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')
print mock_foo.call_args_list
for call_args in mock_foo.call_args_list:
print '---'
print getsource(call_args[0][0])
Run Code Online (Sandbox Code Playgroud)
结果:
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')
Run Code Online (Sandbox Code Playgroud)
这是通过示例代码的测试版本。它测试两种方式:调用模板并检查模板的源。
# 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11559 次 |
| 最近记录: |