繁体   English   中英

摘要通用 Mocking - 无法实例化属性的代理 class?

[英]Abstract Generic Mocking - cannot instantiate proxy class of property?

我试图在抽象的通用 class 中模拟一个函数,它的构造函数中有更多的抽象类。

这是测试:

        [Test]
        public void AbstractRepoTest()
        {
            var options = new Mock<DbContextOptions<CustomDbContext>>();
            var db = new Mock<CustomDbContext>(options);
            var repo = new Mock<BaseRepository<EntityBase>>(db);
            var service = new Mock<BaseService<EntityBase>>(repo, db);

            IQueryable<FactTableRevenue> theInfo = Enumerable.Empty<FactTableRevenue>().AsQueryable();

            repo.Setup(x => x.GetById("test")).Returns(theInfo);

            var abstractService = service.Object;

            Assert.AreEqual(theInfo, abstractService.GetById("test"));
        }

这是 CustomDbContext 构造函数:

 public class CustomDbContext : DbContext
    {
        public CustomDbContext(DbContextOptions<CustomDbContext> options) : base(options)
        {
        }

    }

这是 BaseRepository 构造函数:

public abstract class BaseRepository<T> where T : EntityBase
    {
        internal readonly CustomDbContext _db;

        public BaseRepository(CustomDbContext db)
        {
            _db = db;
        }
     }

这是 BaseService 构造函数:

  public abstract class BaseService<T> where T : EntityBase
    {
        public DbContext _db { get; }

        public BaseRepository<T> _repository;

        public BaseService(BaseRepository<T> repository, DbContext db)
        {
            _repository = repository;
            _db = db;
        }
    }

这是错误代码:

Tests.UnitTestService.AbstractRepoTest

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Services.Services.BaseService`1[[Database.Common.E...

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Services.Services.BaseService`1[[Database.Common.EntityBase, Database, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
Could not find a constructor that would match given arguments:
Moq.Mock`1[Services.Repositories.BaseRepository`1[Database.Common.EntityBase]]
Moq.Mock`1[Database.CustomDbContext.CustomDbContext]

   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyInstance(Type proxyType, List`1 proxyArguments, Type classToProxy, Object[] constructorArguments)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
   at Moq.CastleProxyFactory.CreateProxy(Type mockType, IInterceptor interceptor, Type[] interfaces, Object[] arguments) in C:\projects\moq4\src\Moq\ProxyFactories\CastleProxyFactory.cs:line 62
   at Moq.Mock`1.InitializeInstance() in C:\projects\moq4\src\Moq\Mock`1.cs:line 311
   at Moq.Mock`1.OnGetObject() in C:\projects\moq4\src\Moq\Mock`1.cs:line 325
   at Moq.Mock.get_Object() in C:\projects\moq4\src\Moq\Mock.cs:line 179
   at Moq.Mock`1.get_Object() in C:\projects\moq4\src\Moq\Mock`1.cs:line 283
   at Tests.UnitTestService.AbstractRepoTest() in C:\Users\USER\RiderProjects\REST\Tests\UnitTestService.cs:line 58

您遇到的构造问题很可能是您将模拟 object (例如db )而不是模拟 object (例如db.Object )传递给模拟构造函数。

var options = new Mock<DbContextOptions<CustomDbContext>>();
var db = new Mock<CustomDbContext>(options);
var repo = new Mock<BaseRepository<EntityBase>>(db.Object);
var service = new Mock<BaseService<EntityBase>>(repo.Object, db.Object);

有两个问题。 我是 mocking 选项并将其提供给我的 DbContext 实现,并且我没有将对象传递给构造函数而不是模拟。

我通过添加一个空的构造函数更改了 CustomDbContext:

protected CustomDbContext(){}

并删除了选项并实现了模拟:

            var db = new Mock<CustomDbContext>();
            var repo = new Mock<BaseRepository<EntityBase>>(db.Object);
            var service = new Mock<BaseService<EntityBase>>(repo.Object, db.Object);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM