gpt4 book ai didi

C# 如何向Moq Entity Framework DbSet添加方法

转载 作者:行者123 更新时间:2023-12-02 20:55:37 25 4
gpt4 key购买 nike

我正在尝试创建一个测试来测试 Entity Framework Add方法。任何人都可以帮助如何模拟 DbSet.Add 方法。我已尝试如下但不起作用。我做错了什么?

repository.Insert之后我得到的结果是null...

测试.cs:

var productToCreate = new Product { Name = "Added", Description = "Added" };        

var result = repository.InsertAsync(objToCreate, userContext).Result;
Assert.AreEqual(result.Name, "Added");

模拟.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;
}

存储库:

public async Task<Product> InsertAsync(Product input)
{
using (var ctx = .....))
{
var added = ctx.Set<Product>().Add(input);

await ctx.ValidateAndSaveAsync();

return added;
}
}

最佳答案

根据被测方法中如何使用Add方法...

var added = ctx.Set<Product>().Add(input);

...设置中还应该有一个Returns,用于返回输入的参数(如果这是所需的功能)。

set.Setup(x => x.Add(It.IsAny<T>()))
.Returns<T>(arg => arg)
.Callback<T>((s) => data.Concat(new[] { s }));

但是考虑到有关上下文依赖的信息未知......

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);
}

关于C# 如何向Moq Entity Framework DbSet添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40484365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com