Написание модульного теста для класса Builder - PullRequest
2 голосов
/ 22 января 2020

Я пишу проект, который берет файл JSON для десериализации его, сборки данных и их обработки, а затем сохраняет их в базе данных. Теперь я хочу написать модульный тест с использованием Mock для этого класса, но я не знаю, как это сделать, потому что в этом методе я выравниваю только поле в моем DTO и базе данных

, это мой заказ Dto

  public class OrderDto
  {
            public int Code { get; set; }
            public int CustomerCode { get; set; }
            public int StoreCode { get; set; }
            public string OrderDate { get; set; }
            public string OrderStatus { get; set; }
            public string DeliveryDate { get; set; }

  }

Это мой класс строителя заказов

 public class OrderBuilder
  {
      static PracticeEntities _context;

      public OrderBuilder(PracticeEntities4 context)
      {
          _context = context;
      }
        public static CustomersOrder OrderBuild(OrderDto dto)
        {
            //using (var context = new PracticeEntities4())
            //{
                var oldStoreId = _context.Stores.FirstOrDefault(e => e.Code == dto.StoreCode).Id;
                var oldCustomerId = _context.Customers.FirstOrDefault(e => e.Code == dto.CustomerCode).Id;
                return new CustomersOrder()
                {
                    OrderDate = Convert.ToDateTime(dto.OrderDate),
                    OrderStatus = dto.OrderStatus,
                    DeliveryDate = Convert.ToDateTime(dto.DeliveryDate),
                    CustomerId = oldCustomerId,
                    StoreId = oldStoreId,
                    Code = dto.Code
                };
            //};
        }


    }

Ответы [ 2 ]

1 голос
/ 22 января 2020

ОБНОВЛЕНО

Первое, на что следует обратить внимание, это то, что класс stati c не может быть проверен юнитом. Таким образом, метод, подлежащий испытанию, должен быть изменен, как показано ниже. Кроме того, интерфейс dbcontext т.е. IPracticeEntities4, который реализован в классе PracticeEntities4, должен быть внедрен, чтобы его можно было смоделировать.

 public class PracticeEntities4:IPracticeEntities4, DbContext
 {
  ....
 } 

public class ClassMethod2BTested
{  
   IPracticeEntities4 _context; //declare the context
   public ClassMethod2BTested(IPracticeEntities4 context) // inject the context
   {
      _context=context; // set the context to local variable
   }
   public CustomersOrder OrderBuild(OrderDto dto)
   {
        //using (var context = new PracticeEntities4()) // remove this
        {
            var oldStoreId = _context.Stores.FirstOrDefault(e => e.Code == dto.StoreCode).Id;
            var oldCustomerId = _context.Customers.FirstOrDefault(e => e.Code dto.CustomerCode).Id;
            return new CustomersOrder()
            {
                OrderDate = Convert.ToDateTime(dto.OrderDate),
                OrderStatus = dto.OrderStatus,
                DeliveryDate = Convert.ToDateTime(dto.DeliveryDate),
                CustomerId = oldCustomerId,
                StoreId = oldStoreId,
                Code = dto.Code
            };
        };
    }
}

Теперь вышеприведенный метод можно объединить проверенным.

Для модульного теста, пожалуйста, проверьте образец здесь: Mocking EF DbContext с Moq

Добавлено

Пожалуйста, проверьте этот код : github

1 голос
/ 22 января 2020

Поскольку вы используете Entity Framework, я думаю, что эта статья поможет вам: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/testing/mocking

Создайте свой собственный двойной тест - Этот подход включает в себя написание ваших собственных реализация памяти вашего контекста и DbSets. Это дает вам большой контроль над тем, как ведут себя классы, но может включать в себя написание и владение разумным количеством кода.

Использование фальшивой среды для создания двойников теста - Используя фальшивую среду (такую ​​как Moq), вы можете иметь в памяти реализации вашего контекста и наборы, созданные динамически во время выполнения для вас.

Так что с первым способом вы можете смоделировать вызов БД с указанными c данными и убедиться, что результат возвращается успешно.

Эти тесты, хотя и не защищают бизнес-ошибки, защищают ваш код от пропущенных нулевых проверок и подобных ошибок времени выполнения.

...