2016-12-27 17 views
0

Мне нужно реализовать подделки для модульного тестирования одного из моих методов. Проблема метода мне нужно тест вызывает метод класса и получает некоторую систему parameters.Scenario, как показано ниже:Необходимо создать подделки для класса, который управляет результатами интерфейса в инструменте тестирования модулей Microsoft, используя C#

Class A(){ 
     public void method xx(){ 
     //This needs to be tested. 
     //This method makes a call to retrieve some informations. The call is like 
      below: 
      String culture=Api.GetEnvironmentData().GetCulture(); 
      //This is the problem area. 
      boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi(); 
      //This is the problem area. 
     } 
    } 

Этот метод GetEnvironmentData что-то вроде этого:

public static EnvironmentData GetEnvironmentData() 
{ 
    return GetDiContainer().Resolve<EnvironmentData >();     
} 

EnvironmentData класс что-то вроде это:

public class EnvironmentData(){ 
public EnvironmentData(IEnvironmentDataProvider EnvironmentDataProvider){ 
// 
} 
} 

я могу фальсифицировать, используя MOQ IEnvironmentDataProvider, но я не в состоянии понять, как подделать класс EnvironmentData. Мне нужно подделать класс EnvironmentData, потому что он обрабатывал результаты IEnvironmentDataProvider на основе различных вызовов методов. Например, как GetCulture, так и DoImplmentApi вызывают метод getData интерфейса IEnvironmentDataProvider, а затем отбрасывают их соответствующим образом. Теперь, когда я подделываю IEnvironmentDataProvider и возвращаю некоторое значение, я не могу контролировать, что возвращать, когда GetCulture и когда вызывается DoImplmentApi.

Может кто-нибудь предложить, как реализовать подделки для вышеуказанного сценария.

+0

Вы это с тегами [Microsoft-подделками], но вы говорите об использовании MOQ. Итак, какой из них вы используете? –

+0

Привет, Джек. Я пытаюсь сделать это с помощью nubit и moq .... Я хочу установить что-то вроде подделок Microsoft или, возможно, даже использовать в nunit. Вот почему я отметил это так. – Azmi

ответ

0

Вам не нужно издеваться над зависимостями от EnvironmentData класс. Я вижу здесь одну проблему: вы используете контейнер DI, например Service Locator, который в этом сценарии ведет себя как антипаттерн. Все зависимости должны быть введены, например. g .: по конструктору или свойству.

Изменить Api класс что-то вроде этого:

public class Api 
{ 
     private readonly EnvironmentData _environmentData; 

     public Api(EnvironmentData envData) 
     { 
      environmentData = envData; 
     } 

     public string GetCulture() 
     { 
      return _envData.GetCulture();     
     } 
} 

Помните, что детали реализации класса Api должны быть скрыты. В этом случае вы не должны показывать EnvironmentData. Api класс должен запросить все зависимости, которые необходимы для реализации этого класса и имеет собственный интерфейс.

+0

Спасибо за ввод, но изменение существующей архитектуры для меня нецелесообразно. Мне придется разрабатывать модульные тесты вокруг существующих реализаций. – Azmi

+0

@ Азми вы могли бы указать нам, какой из классов вы можете изменить? Это только класс А? – andreasnico

+0

@Pawel ... в принципе я не могу изменить какой-либо класс. Мне придется писать тестовые модули устройства вокруг существующего один раз. – Azmi

0

Основываясь на ваших комментариях, я думаю, что ваш лучший снимок - это обернуть статический класс в фасад. Тогда вы можете издеваться над фасадом.

Что-то вроде этого:

Class A 
{ 
     IEnvironmentDataFacade _environmentDataFacade; 
     Class A(IEnvironmentDataFacade environmentDataFacade) 
     { 
      _environmentDataFacade = environmentDataFacade; 
     } 

     public void method xx() 
     { 
      //Now you can fake IEnvironmentDataFacade: 
      String culture= _environmentDataFacade.GetCulture(); 
      //Do the same as above with the method here: 
      boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi(); 
      //This is the problem area. 
     } 
} 

public class EnvironmentDataFacade : IEnvironmentDataFacade 
{ 
     public string GetCulture() 
     { 
      return Api.GetEnvironmentData().GetCulture(); 
     } 


} 

public interface IEnvironmentDataFacade 
{ 
     string GetCulture(); 
} 
+0

@andreasnico ... это нечто вроде создания заглушки. – Azmi