单元测试迭代循环的方法

时间:2015-08-05 18:26:12

标签: python unit-testing

我正在尝试提出一种测试方法的好方法,该方法通过一些循环,然后获取一个对象并调用其中一个方法。那个班有自己的测试,所以我不确定在这里测试什么。我写过它在测试用例中有不同的行为,这显然不太理想。

我正在寻找关于如何在没有条件的情况下进行测试的建议。

def direct(self, test=False):
    """
    routes data in self.data_groups to
    consumers in self.consumers_list
    """
    if test:
        output_list = []
    for data_type, group in self.data_groups.items():
        if test:
            output_list.append(data_type)
            output_list.append(group)
        for consumer_name in self.consumers_list[data_type]:
            for record in group:
                if test:
                    output_list.append(record.values()[0])
                else:
                    consumer = self.get_consumer(consumer_name,
                                                 record)
                    consumer_output = consumer.do_something()

    if test:
        return output_list
    return True

2 个答案:

答案 0 :(得分:3)

不幸的是,我不确定你所说的是可能的。我会说你可以使用一个装饰器,但如果没有完全直接覆盖,那就没用了。我不确定这对你来说是否更好,但你可以在自己的类中覆盖测试方法?这样可以使它看起来更清晰,您可以以更直观的方式对代码进行分组。

做类似的事情:

class DirectClass:
    def __init__(self):
        self.data_groups = dict
        self.consumers_list = list

    def direct(self):
        """
        routes data in self.data_groups to
        consumers in self.consumers_list
        """
        for data_type, group in self.data_groups.items():
            for consumer_name in self.consumers_list[data_type]:
                for record in group:
                    consumer = self.get_consumer(consumer_name,
                                                 record)
                    consumer_output = consumer.do_something()

        return True

class TestDirect(DirectClass):
    def __init__(self):
        DirectClass.__init__(self)

    def direct(self):
        output_list = []
        for data_type, group in self.data_groups.items():
            output_list.append(data_type)
            output_list.append(group)
            for consumer_name in self.consumers_list[data_type]:
                for record in group:
                    output_list.append(record.values()[0])

        return output_list

答案 1 :(得分:1)

我决定对使用者返回的对象进行子类化,这样我就可以调用相同的代码并使用过度运行(以前称为do_something)方法返回测试数据。还有比我想要的更多的ifs,但它实现了我的大部分目标。感谢@ user2916286让我在这种情况下考虑子类化。

def direct(self, test=False):
    """
    routes data in self.data_groups to
    consumers in self.consumers_list
    """
    if test:
        output_list = []
    for data_type, group in self.data_groups.items():
        if test:
            output_list.append(data_type)
            output_list.append(group)
        for consumer_name in self.consumers_list[data_type]:
            for record in group:
                consumer = self.get_consumer(consumer_name,
                                             record, test=test)
                consumer_output = consumer.run()
                if not consumer_output:
                    raise Exception('consumer failed')
                output_list.append(consumer_output)
    if test:
        return output_list
    return True