C#如何使用Moq entityframework数据库集添加方法
我正在尝试创建一个测试到测试实体框架C#如何使用Moq entityframework数据库集添加方法,c#,unit-testing,c#-4.0,entity-framework-4,moq,C#,Unit Testing,C# 4.0,Entity Framework 4,Moq,我正在尝试创建一个测试到测试实体框架Add方法。任何人都可以帮助模拟DbSet.Add方法。我试过以下方法,但没有效果。我做错了什么 我得到的结果是repository.Insert之后的null Test.cs: var productToCreate = new Product { Name = "Added", Description = "Added" }; var result = repository.InsertAsync(objToCreate, userCon
Add
方法。任何人都可以帮助模拟DbSet.Add
方法。我试过以下方法,但没有效果。我做错了什么
我得到的结果是repository.Insert
之后的null
Test.cs:
var productToCreate = new Product { Name = "Added", Description = "Added" };
var result = repository.InsertAsync(objToCreate, userContext).Result;
Assert.AreEqual(result.Name, "Added");
Mock.cs
internal static DbSet<T> GetMockedDataSet<T>(IEnumerable<T> data) where T : class
{
// Create a mocked data set that contains the data
var set = new Mock<DbSet<T>>();
set.As<IDbAsyncEnumerable<T>>()
.Setup(m => m.GetAsyncEnumerator())
.Returns(new TestDbAsyncEnumerator<T>(data.GetEnumerator()));
set.As<IQueryable<T>>()
.Setup(m => m.Provider)
.Returns(new TestDbAsyncQueryProvider<T>(data.AsQueryable().Provider));
set.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.AsQueryable().Expression);
set.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.AsQueryable().ElementType);
set.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
set.Setup(x => x.AsNoTracking()).Returns(set.Object);
set.Setup(x => x.Add(It.IsAny<T>())).Callback<T>((s) => data.Concat(new[] { s }));
// Return the mock
return set.Object;
}
内部静态DbSet GetMockedDataSet(IEnumerable数据),其中T:class
{
//创建包含数据的模拟数据集
var set=newmock();
set.As()
.Setup(m=>m.GetAsyncEnumerator())
.Returns(新的TestDbAsyncEnumerator(data.GetEnumerator());
set.As()
.Setup(m=>m.Provider)
.Returns(新的TestDbAsyncQueryProvider(data.AsQueryable().Provider));
set.As().Setup(m=>m.Expression).Returns(data.AsQueryable().Expression);
set.As().Setup(m=>m.ElementType).Returns(data.AsQueryable().ElementType);
set.As().Setup(m=>m.GetEnumerator()).Returns(data.GetEnumerator());
Setup(x=>x.AsNoTracking()).Returns(set.Object);
Setup(x=>x.Add(It.IsAny()).Callback((s)=>data.Concat(new[]{s}));
//归还模拟
返回set.Object;
}
存储库:
public async Task<Product> InsertAsync(Product input)
{
using (var ctx = .....))
{
var added = ctx.Set<Product>().Add(input);
await ctx.ValidateAndSaveAsync();
return added;
}
}
public异步任务InsertAsync(产品输入)
{
使用(var ctx=…))
{
var added=ctx.Set().Add(输入);
等待ctx.ValidateAndSaveAsync();
增加了退货;
}
}
根据在测试方法中如何使用添加
方法
var added = ctx.Set<Product>().Add(input);
但是考虑到上下文依赖性的信息是未知的
using (var ctx = .....))
不确定提供的解决方案是否能达到预期效果
另外,如果测试异步方法,不要混合使用异步和同步调用。下面一行
var result = repository.InsertAsync(objToCreate, userContext).Result;
…可能导致死锁
使测试方法始终异步
[TestMethod]
public async Task InsertAsync_Should_Return_Product() {
//...other code
var expected = new Product { Name = "Added", Description = "Added" };
var actual = await repository.InsertAsync(expected, userContext);
Assert.AreEqual(expected.Name, actual.Name);
}
根据测试方法中如何使用
Add
方法
var added = ctx.Set<Product>().Add(input);
但是考虑到上下文依赖性的信息是未知的
using (var ctx = .....))
不确定提供的解决方案是否能达到预期效果
另外,如果测试异步方法,不要混合使用异步和同步调用。下面一行
var result = repository.InsertAsync(objToCreate, userContext).Result;
…可能导致死锁
使测试方法始终异步
[TestMethod]
public async Task InsertAsync_Should_Return_Product() {
//...other code
var expected = new Product { Name = "Added", Description = "Added" };
var actual = await repository.InsertAsync(expected, userContext);
Assert.AreEqual(expected.Name, actual.Name);
}
提供一个复制问题的方法。@Nkosi,对不起,我不明白你的意思是什么?我已经提供了我的代码块,并解释了我期望的是什么?。谢谢这个例子不完整。未知因变量太多,无法重新创建问题,测试中的方法与测试中显示的不同,显示的设置不完整……需要我继续吗?提供一个复制问题的方法。@Nkosi,对不起,我不明白你的意思?我已经提供了我的代码块,并解释了我期望的是什么?。谢谢这个例子不完整。太多的因变量未知,无法重新创建问题,测试中的方法与测试中显示的不同,显示的设置不完整…我需要继续吗?哇!它很有魅力。非常感谢。我将testmethod更改为使用async。感谢您的提醒-您对add方法的回调没有任何作用。它对提供的原始收藏没有影响。哇!它很有魅力。非常感谢。我将testmethod更改为使用async。感谢您的提醒-您对add方法的回调没有任何作用。它对提供的原始收藏没有影响。