无法实例化类的代理:Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry

Ask*_*Ask 3 .net unit-testing moq asp.net-core

我的存储库中有一个方法,它调用 datacontext.Add 方法并返回 resutl.Entity,如下所示:

 var result =  _dataContext.Product.Add(product);
 await _dataContext.SaveChangesAsync();
 return result.Entity;
Run Code Online (Sandbox Code Playgroud)

现在我想创建模拟,EntityEntry<Product>但出现异常:

消息:Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的代理:Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry`1[[Product、Product.Entities、Version=1.0.0.0、Culture=neutral、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);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者还有其他方法来断言 EntityEntry 吗?

小智 8

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

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);
Run Code Online (Sandbox Code Playgroud)