c# - 为构建器类编写单元测试

标签 c# unit-testing mocking

我正在编写一个项目,该项目采用 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
                };
            //};
        }


    }

最佳答案

已更新

首先要注意的是静态类不能进行单元测试。因此,要测试的方法应修改如下所示。此外,需要注入(inject)在 PracticeEntities4 类中实现的 dbcontext 即 IPracticeEntities4 接口(interface),以便可以模拟它。

 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 with Moq

已添加

请检查此代码: github

关于c# - 为构建器类编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59853573/

相关文章:

angularjs - 如何使用特定的假 'event' 参数调用 triggerHandler?

ruby-on-rails - 如何获取从设置或拆卸回调中运行的测试的名称?

java - mockito 和 jetty-client : receiving NullPointerException when start() and stop() methods are invoked

php - 无法通过 Mock 测试

c# - 隐式等待?

c# - 将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

c# - EF代码首先更改数据类型bool? bool 和整数?到整数

python - 基于输入参数模拟python函数

c# - Entity Framework 。测试 SaveChanges 是否存在并在方法中的正确位置调用

C# - Winforms - 事件流循环