2015-08-05 2 views
4

Я пытаюсь найти хороший способ протестировать метод, который проходит через некоторые циклы, а затем получает объект и вызывает один из его методов. У этого класса есть свои собственные тесты, поэтому я не уверен точно, что тестировать здесь. Я написал это, чтобы иметь другое поведение в тестовом примере, что, очевидно, не идеально.Единичное тестирование метода, который повторяется через петли

Я ищу предложения о том, как улучшить это, чтобы протестировать без условных обозначений.

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 
+0

Что именно вы пытаетесь проверить здесь? В ваших тестах у вас есть список предметов; это все, что ты хочешь? Зачем вам это нужно проверять? Какую пользу вы получаете от этого теста? – Dannnno

+0

@ Dannnno Я пишу модульные тесты для каждого метода в каждом классе. Вопрос был перенесен из codereview (я не уверен, почему), и это был лучший способ протестировать метод. Преимущество имеет хорошее покрытие тестирования, а также проверку того, что метод делает то, что он должен. – user3610360

+0

Я знаю, я видел вопрос о CR. Не преследуйте покрытие ради покрытия - если это не дает вам ничего осязаемого, то это вам не поможет. Вы упомянули, что у вас уже есть модульные тесты для класса. Значит ли это, что такие вещи, как 'self.get_consumer (имя_пользователя, запись)', уже хорошо протестированы? Написание тестов для этого действительно зависит от того, какие части этого имеют значение, и какие части мы можем игнорировать. – Dannnno

ответ

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

я остановился на суб-причислять объекта, возвращенного потребителем, так что я мог бы назвать один и тот же код и иметь подавляться пробег (ранее do_something) данных метод возвращения тестов. Есть еще больше, чем я хочу, но он достигает большей части моей цели. Приобретите @ 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 
Смежные вопросы