【问题标题】:Can not instantiate proxy of class: Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry无法实例化类:Microsoft.entityFrameWorkCore.changeTracking.entityEntry
【发布时间】:2019-04-19 17:21:00
【问题描述】:

我的仓库中有一个方法,它调用 datacontext.Add 方法并返回 resutl.Entity,如:

 var result =  _dataContext.Product.Add(product);
 await _dataContext.SaveChangesAsync();
 return result.Entity;

现在我想为 EntityEntry<Product> 创建模拟,但我遇到了一个异常:

消息:Castle.DynamicProxy.InvalidProxyConstructorArgumentsException :无法实例化类的代理: Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry`1[[产品, Product.Entities,版本=1.0.0.0,文化=中性, PublicKeyToken=null]]。找不到无参数构造函数。

这是我的测试方法代码:

 var productMock = new Mock<EntityEntry<Product>>();
 var entity = new Product{Id = 1, Name = "Bag"};
 mappingMock.Setup(m => m.Entity).Returns(entity);
 var dataContextMock = new Mock<DataContext>(_options);
 var productMockSet = new Mock<DbSet<Product>>();
 dataContextMock.Setup(a => a.Product)
     .Returns(productMockSet.Object);
 dataContextMock.Setup(m => m.Product.Add(It.IsAny<Product>())).Returns(productMock.Object);

我做错了什么?还是有其他方法来断言 EntityEntry?

【问题讨论】:

  • 如错误docs.microsoft.com/en-us/ef/core/api/… 所述,该类没有无参数构造函数
  • 另请注意This API supports the Entity Framework Core infrastructure and is not intended to be used directly from your code. This API may change or be removed in future releases.
  • 尝试模拟 EF 可能是一项任务。考虑使用内存数据库
  • 我做错了什么?您正在尝试集成测试外部框架/库。这不是您的任务,EF Core 已经过 Microsoft 测试。您应该针对自己的代码进行测试。对于集成测试,请使用 Nkosi 所说的内存。对于单元测试,最好抽象你的代码。您应该在单元测试中模拟您的存储库,而不是 EF Core
  • 那我如何断言我的方法?

标签: .net unit-testing asp.net-core moq


【解决方案1】:

我认为您缺少这些模拟对象:

var iStateManager = new Mock<IStateManager>();
var model = new Mock<Model>();

var productEntityEntry = new Mock<EntityEntry<Product>>(
new InternalShadowEntityEntry(iStateManager.Object, new EntityType("Product", model.Object, ConfigurationSource.Convention)));

productEntityEntry.SetupGet(m=> m.Entity).Returns(entity);

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2011-08-14
    • 2018-09-05
    • 2020-11-06
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多