用补丁模拟两个函数进行单元测试

编程入门 行业动态 更新时间:2024-10-26 12:32:49
本文介绍了用补丁模拟两个函数进行单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个要进行单元测试的函数,其中包含对另外两个函数的调用.我不确定如何正确使用补丁同时模拟这两个函数.我在下面提供了一个例子来说明我的意思.当我运行鼻子测试时,测试通过了,但我觉得必须有一种更简洁的方法来做到这一点,而且我并不真正理解关于 f.close() 的部分...

I have a function I want to unit test contains calls two other functions. I am unsure how can I mock both functions at the same time properly using patch. I have provided an example of what I mean below. When I run nosetests, the tests pass but I feel that there must be a cleaner way to do this and I do not really Understand the piece regarding f.close()...

目录结构如下:

program/ program/ data.py tests/ data_test.py

数据.py:

import cPickle def write_out(file_path, data): f = open(file_path, 'wb') cPickle.dump(data, f) f.close()

data_test.py:

data_test.py:

from mock import MagicMock, patch def test_write_out(): path = '~/collection' mock_open = MagicMock() mock_pickle = MagicMock() f_mock = MagicMock() with patch('__builtin__.open', mock_open): f = mock_open.return_value f.method.return_value = path with patch('cPickle.dump', mock_pickle): write_out(path, 'data') mock_open.assert_called_once_with('~/collection', 'wb') f.close.assert_any_call() mock_pickle.assert_called_once_with('data', f)

结果:

$ nosetests . ---------------------------------------------------------------------- Ran 1 test in 0.008s OK

推荐答案

您可以通过使用补丁装饰器并像这样嵌套它们来简化测试(默认情况下它们是 MagicMock 对象):

You can simplify your test by using the patch decorator and nesting them like so (they are MagicMock objects by default):

@patch('cPickle.dump') @patch('__builtin__.open') def test_write_out(mock_open, mock_pickle): path = '~/collection' f = mock_open.return_value f.method.return_value = path write_out(path, 'data') mock_open.assert_called_once_with('~/collection', 'wb') mock_pickle.assert_called_once_with('data', f) f.close.assert_any_call()

对 MagicMock 实例的调用会返回一个新的 MagicMock 实例,因此您可以检查返回的值是否像任何其他模拟对象一样被调用.在这种情况下,f 是一个名为 'open()' 的 MagicMock(尝试打印 f).

Calls to a MagicMock instance return a new MagicMock instance, so you can check that the returned value was called just like any other mocked object. In this case f is a MagicMock named 'open()' (try printing f).

更多推荐

用补丁模拟两个函数进行单元测试

本文发布于:2023-11-03 20:00:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1555954.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   补丁   单元测试   两个

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!