gpt4 book ai didi

c# - 模拟 FindAsync 方法

转载 作者:行者123 更新时间:2023-12-05 04:11:06 25 4
gpt4 key购买 nike

我通过以下代码模拟了 FindAsync:

var brands = new Mock<DbSet<Brand>>();
ConfigureTheDbSet(brands, brandData);
brands.Setup(b => b.FindAsync(It.IsAny<object[]>())) //substitution of the .SelectAsync(id) method
.Returns<object[]>(ids => brands.Object.FirstOrDefaultAsync(b => b.BrandId == (int) ids[0]));

在我将 AsNoTracking 模拟添加到上下文之前,它一直正常工作:

var mockContext = new Mock<ReportDbContext>();
mockContext.Setup(m => m.Set<Brand>()).Returns(brands.Object);
mockContext.Setup(m => m.Set<Brand>().AsNoTracking()).Returns(brands.Object);

并且 FindAsync 返回 null。为了让它工作,我添加了以下模拟:

mockContext.Setup(m => m.Set<Brand>().FindAsync(It.IsAny<object[]>()))
.Returns<object[]>(async d => await brands.Object.FindAsync(d));

有人知道为什么会这样吗?

最佳答案

IMO,您应该模拟接口(interface),例如 IBrandRepository。否则 mock 的意义何在? - 你可以只创建你的类的一个实例,调用 FindAsync() 并像往常一样断言结果..

以下是我如何将 Moq 与接口(interface)一起使用,例如 repo 接口(interface);

// arrange
var mockRepo = new Mock<IBrandRepository>();
mockRepo.Setup(o => o.FindAsync(It.IsAny<string>())).ReturnsAsync(new Brand[] { ... });

var someClass = new SomeClass(IBrandRepository); // someClass that use IBrandRepository

// act
string search = "brand1 brand2"; // what the user searches for
var results = someClass.FindBrands(searchText) // internally calls IBrandRepository.FindAsync()

// assert
// Assert.AreEqual(results.Count(), ...

关于c# - 模拟 FindAsync 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43369420/

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