首页 > 解决方案 > .net core中的魔清DI-ed DbContext

问题描述

我开始使用 ef core 在 .net core 中为(webapi)应用程序编写测试。我要测试的存储库如下所示:

   public class MyRepository : IMyRepository
   {
   private readonly IDbContext Db;
   public MyReporitory(IDbContext db) 
      {
         Db = db;
      }
   /// Methods to access the Database
      public List<MyType> Get() {
         return Db.Set<Type>();
      }

在我的测试中,我现在尝试模拟 DBContext:

 var dbContextMock = new Mock<IDBContext>();
 var classToBeTested = new MyRepository(dbContextMock)
 var result = classToBeTested.Get() (or any other method in my repository);
 Assert.That(result, Is.TypeOf<MyType>)

当我运行测试时,我得到一个空异常,因为返回的结果是空的(我没有告诉模拟如何返回数据?)如何将数据添加到模拟的 DbContext 以便 Get() 可以得到它?

标签: c#unit-testing.net-coreentity-framework-coremoq

解决方案


使用最小起订量设置返回数据。如果我是正确的,你已经在你的界面中创建了一个 Set 方法。只是嘲笑那个方法

如果您的 set 方法返回 DbSet 类型,那么您可以使用这段代码来模拟它

        var mockDbSet = new Mock<DbSet<TestClass>>();
        mockDbSet.As<IQueryable<TestClass>>().Setup(m => m.Provider).Returns(data.Provider);
        mockDbSet.As<IQueryable<TestClass>>().Setup(m => m.Expression).Returns(data.Expression);
        mockDbSet.As<IQueryable<TestClass>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockDbSet.As<IQueryable<TestClass>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator);

数据属于 IQueryable 类型


推荐阅读