python-模拟和单元测试更改输入列表的方法链

时间:2019-06-03 22:48:33

标签: python unit-testing mocking

我有一个过滤器列表,每个过滤器都会更改输入列表。如何为每个将更改输入列表的过滤器创建一个模拟?

class TwoFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 2 != 0]

class ThreeFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 3 != 0]

class FourFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 3 != 0]

class MyFilters(object):

    def __init__(self):
        self.filters = [TwoFilter(), ThreeFilter(), FourFilter()]

    def apply_filters(self, arr):
        for f in self.filters:
            f.filter(arr)

我想通过模拟apply_filters中输入[1,2,3,4]中的过滤器来对self.filters进行单元测试。有没有办法让每个模拟更改输入arr并验证是否使用此经过修改的arr调用了每个后续过滤器?

PS:我可以通过让过滤器返回arr并使用mock.return_value来更改模拟输出来解决这个问题。

1 个答案:

答案 0 :(得分:0)

当您谈到模拟过滤器类时,我认为您的方法也要分别测试过滤器类?当然,这仍然应该做,最好做得更好-如果我没看错您的代码,那么您很可能会发现一个错误。

关于apply_filters的测试:为什么要完全模拟过滤器类?似乎没有道理-您可以使用apply_filters的一些合适值调用arr来查看是否实际调用了其他过滤器。而且,也许您找到了下一个错误(在更正了第一个错误之后)-只是尝试查找如果未调用第三个过滤器就会失败的测试用例。

应该出于某种原因进行模拟-看一下When to use mock objects in unit tests