2012-02-12 2 views
4

Я очень новичок в тестировании и написании/использовании исключений. В настоящее время я прилагаю огромные усилия, чтобы узнать о лучших практиках и интегрировать их в свои проекты. В качестве теста некоторых вещей, которые я читал, я написал простой контрактный модуль. Ниже приведена инициатива класса контракта, которая имеет несколько аргументов, которые зависят друг от друга.Написание единиц измерения для метода __init__ класса

Как мне написать/должен ли я написать тест для метода init на основе его зависимостей аргументов.

Заранее благодарен!

def __init__(self, code, description ,contract_type, 
      start_date ,end_date ,reminder_date, 
      customer=None, isgroup=False, vendor=None, 
      discount_perc=None): 

    contract_types = ['item','vendor'] 
    self.code = code 
    self.description = description 
    self.contract_type = contract_type 
    self.start_date = start_date 
    self.end_date = end_date 
    self.reminder_date = reminder_date 
    if contract_type not in contract_types: 
     raise AttributeError("Valid contract types are 'item' & 'vendor'") 
    if isgroup: 
     if customer: 
      raise AttributeError("Group contracts should not have 'customer' passed in") 
     self.is_group_contract = True 
    else: 
     if customer: 
      self.add_customer(customer) 
     else: 
      raise AttributeError('Customer required for non group contracts.') 
    if contract_type == 'vendor': 
     if vendor and discount_perc: 
      self.vendor = vendor 
      self.discount_perc = discount_perc 
     else: 
      if not vendor: 
       raise AttributeError('Vendor contracts require vendor to be passed in') 
      if not discount_perc: 
       raise AttributeError('Vendor contracts require discount_perc(Decimal)') 

Если этот вопрос не подходит для SO, где я могу быть лучше?

+0

IIRC, programmers.stackexchange.com лучше подходит для рассмотрения кода/рефакторинга. –

+0

Тем не менее, одна идея состоит в том, чтобы просто уменьшить количество способов, с помощью которых все может пойти не так. Вместо того, чтобы иметь отдельные параметры 'customer' и' isgroup', используйте специальное значение 'GROUP' для' customer' для указания групповых контрактов. –

+1

ваши два первых вопроса лучше подходят для CodeReview, но третий (тестирование), я думаю, подходит для SO. Может быть, вы должны разделить свой вопрос на две части. – joaquin

ответ

3

Я бы рассматривал __init__, как и любой другой (не классический или статический) метод - ожидаемый результат проверки на основе различных комбинаций ввода. Но в дополнение к этому, я бы также протестировал его для возвращения (или не возврата, в зависимости от требований, которые у вас есть) Singleton-объекта.
Однако можно предпочесть извлечь однотонные тесты в качестве связанных с __new__ тестовых примеров.

В конце концов вы будете иметь тесты для: Типы

  1. Недопустимые аргументы обработки (пустые/не пустые строки, целые кортежи, dicts и т.д.).
  2. Обработка неправильных комбинаций аргументов (в вашем случае это исключение).
  3. Необязательные аргументы в отношении наличия/отсутствия обработки (значения по умолчанию работают, пользовательские тоже делают и т. Д.).
  4. Обработка действительных аргументов (положительный поток работает).
  5. Признаки атрибута объекта, присутствующие/отсутствующие, и их значения (вы, безусловно, полагаетесь на них другими способами).
  6. Результирующий объект, являющийся одноточечным (или нет).
  7. ???

Еще один совет: извлечение contract_types = ['item','vendor'] атрибуту класса поможет в организации бизнес-логики.

Смежные вопросы