Nano Hash - криптовалюты, майнинг, программирование

Необходимо создать подделки для класса, который манипулирует результатами интерфейса в инструменте модульного тестирования Microsoft с использованием С#.

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

 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){
//
 }
}

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

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


  • У вас есть тег [microsoft-fakes], но вы говорите об использовании MOQ. Так какой из них вы используете? 04.01.2017
  • Привет, Джек. Я пытаюсь сделать это с помощью nubit и moq.... Я хочу установить что-то вроде подделок Microsoft или даже использовать в nunit, если это возможно. Поэтому я так и отметил. 06.01.2017

Ответы:


1

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

Измените свой класс Api примерно так:

 public class Api
 {
       private readonly EnvironmentData _environmentData;

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

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

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

27.12.2016
  • Спасибо за вклад, но изменение существующей архитектуры для меня не представляется возможным. Мне придется разработать модульные тесты для существующих реализаций. 27.12.2016
  • @Azmi, не могли бы вы указать нам, какой из классов вы можете изменить? Только класс А? 03.01.2017
  • @Pawel ... в основном я не могу изменить какой-либо класс ... Мне придется один раз написать модульные тестовые случаи вокруг существующего. 06.01.2017

  • 2

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

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

    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();
    }
    
    03.01.2017
  • @andreasnico ... это что-то вроде создания заглушки, верно? 06.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..