2010-09-07 2 views
0

У меня есть следующий метод:Правильный способ модульного тестирования частных переменных

private string _google = @"http://www.google.com"; 

public ConnectionStatus CheckCommunicationLink() 
{ 
    //Test if we can get to Google (A happy website that should always be there). 
    Uri googleURI = new Uri(_google); 
    if (!IsUrlReachable(googleURI, mGoogleTestString)) 
    { 
     //The internet is not reachable. No connection is available. 
     return ConnectionStatus.NotConnected; 
    } 

    return ConnectionStatus.Connected; 
} 

Вопрос в том, как я могу получить его, чтобы не попробовать подключение к Google (избегая, таким образом зависимость от интернета будучи вверх) ,

Самый простой способ - принять _google и изменить его, чтобы указать на то, что локально для машины. Но для этого мне нужно сделать _googlepublic. Я бы предпочел не делать этого, потому что приложение _google не должно меняться.

Я могу сделать `_google 'параметром для перегруженной версии метода (или конструктора объекта). Но это также предоставляет интерфейс, который я никогда не хочу использовать.

Другой вариант состоит в том, чтобы сделать _googleinternal. Но для приложения internal - это то же самое, что и public. Таким образом, в то время как другие не видят _google, интерфейс приложения все еще предоставляет его.

Есть ли лучший способ? Если да, укажите это.

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

+0

Вы хотите проверить переменную или CheckCommunicationLink на вашем тестовом примере? – Eiko

+0

@Eiko - метод ('CheckCommunicationLink') – Vaccano

+1

Ant этот тест должен проверить * что именно *? Извините, я не хочу этого теста. Единственное, что этот метод, похоже, проверяет, работает ли интернет. Какую информацию вы получите, если будете подделывать это? Зачем вообще пытаться протестировать? – Eiko

ответ

0

Почему у вас _google жестко закодировано в вашем коде? Почему бы не поместить его в конфигурационный файл, который вы затем можете изменить для своего теста?

0

Некоторые опции:

  • делают _google нагрузки от внешней конфигурации (возможно предоставление www.google.com в качестве значения по умолчанию) и поставить специальную конфигурацию для модульных тестов;
  • Поместите единый тестовый класс внутри класса, содержащего метод CheckCommunicationLink.

Примечание: Я настоятельно рекомендую сделать его настраиваемым. В реальных случаях, полагаясь на доступность конкретного стороннего веб-сайта, это не очень хорошая идея, потому что они могут быть заблокированы локальным брандмауэром и т. Д.

0

Для тестирования модулей вы должны издеваться над любым подключением HTTP, которое вы используете в вашем классе (который скрыт в методе IsUrlReachable). Таким образом, вы можете проверить, действительно ли ваш код пытается подключиться к Google без фактического подключения. Пожалуйста, вставьте метод IsUrlReachable, если вам нужна дополнительная помощь с насмешкой.

Если указанное решение не вариант, вы могли бы рассмотреть возможность локального сервера тест HTTP и:

  1. делая URL настраивается, так что вы можете указать на локальный адрес
  2. (это один противно) Использование отражения для изменения _google перед испытаниями
  3. (большинство пуристов не согласятся здесь) вы можете создать перегрузку принимает параметр и использовать это для тестирования (так что вы только проверить CheckCommunicationLink(string url) метод

код (3):

private string _google = @"http://www.google.com"; 

public ConnectionStatus CheckCommunicationLink() 
{ 
    return CheckCommunicationLink(_google); 
} 

public ConnectionStatus CheckCommunicationLink(string url) 
{ 
    //Test if we can get to Google (A happy website that should always be there). 
    Uri googleURI = new Uri(url); 
    if (!IsUrlReachable(googleURI, mGoogleTestString)) 
    { 
     //The internet is not reachable. No connection is available. 
     return ConnectionStatus.NotConnected; 
    } 

    return ConnectionStatus.Connected; 
} 
1

рефакторинга кода, чтобы зависеть от ICommunicationChecker:

public interface ICommunicationChecker 
{ 
    ConnectionStatus GetConnectionStatus(); 
} 

Тогда ваш тест (ы) может дразнить этот интерфейс делает деталь реализации не имеет значение.

public class CommunicationChecker : ICommunicationChecker 
{ 
    private string _google = @"http://www.google.com"; 

    public ConnectionStatus GetConnectionStatus() 
    { 
     //Test if we can get to Google (A happy website that should always be there). 
     Uri googleURI = new Uri(_google); 
     if (!IsUrlReachable(googleURI, mGoogleTestString)) 
     { 
      //The internet is not reachable. No connection is available. 
      return ConnectionStatus.NotConnected; 
     } 

     return ConnectionStatus.Connected; 
    } 
} 
Смежные вопросы