代码之家  ›  专栏  ›  技术社区  ›  Bob

测试函数是否已应用于集合的每个项的干净方法?

  •  -1
  • Bob  · 技术社区  · 6 年前

    我想测试一个类似于以下内容的函数:

    def some_function_under_test(some_list_type_arg: List):
        map(some_other_function, some_list_type_arg)
    

    什么是一种好的、干净的方法来进行单元测试?

    我要嘲笑 map 作用

    assert map_mock.called_once_with(...)
    

    但是如果函数是这样写的呢

    for i in some_list_type_arg:
        some_other_function(i)
    

    如何独立于其实现来测试此功能,即不将测试绑定到 地图 作用

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex Hall    6 年前

    你可以断言 some_other_function 通过使用仅调用原始函数的模拟对每个元素进行模拟来调用,例如:

    import unittest
    
    from mock import patch, Mock, call
    
    
    def some_other_function(x):
        return 2 * x
    
    
    def some_function_under_test(some_list_type_arg):
        return map(some_other_function, some_list_type_arg)
    
    
    class Tests(unittest.TestCase):
        def test_thing(self):
            with patch('__main__.some_other_function', Mock(side_effect=some_other_function)) as other_mock:
                self.assertEqual(list(some_function_under_test([1, 2, 3])),
                                 [2, 4, 6])
            self.assertEqual(other_mock.call_args_list,
                             [call(1), call(2), call(3)])
    
    
    unittest.main()