gpt4 book ai didi

c# - 无法为通用的 ienumerable 任务设置最小起订量模拟

转载 作者:行者123 更新时间:2023-11-30 21:41:44 26 4
gpt4 key购买 nike

我正在使用模拟库 Moq,但我无法为此签名设置模拟:

Task<IEnumerable<TEntity>> GetAllAsync<TEntity>(
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = null,
int? skip = null,
int? take = null)
where TEntity : class, IEntity;
}

单元测试类

using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using ICEBookshop.API.Factories;
using ICEBookshop.API.Interfaces;
using ICEBookshop.API.Models;
using Moq;
using SpecsFor;

namespace ICEBookshop.API.UnitTests.Factories
{
public class GivenCreatingListOfProducts : SpecsFor<ProductFactory>
{
private Mock<IGenericRepository> _genericRepositorMock;

protected override void Given()
{
_genericRepositorMock = new Mock<IGenericRepository>();
}

public class GivenRepositoryHasDataAndListOfProductsExist : GivenCreatingListOfProducts
{
protected override void Given()
{
_genericRepositorMock.Setup(
expr => expr.GetAllAsync<Product>(It.IsAny<Func<IQueryable<Product>>>(), null, null, null))
.ReturnsAsync<Product>(new List<Product>());

}
}
}
}

这行代码快把我逼疯了:

genericRepositorMock.Setup(
expr => expr.GetAllAsync<Product>(It.IsAny<Func<IQueryable<Product>>>(), null, null, null))
.ReturnsAsync<Product>(new List<Product>());

问题是我不知道如何设置 GetAllAsync 以便它可以编译并返回产品列表。它返回产品列表的期望行为。

谁能帮我用这个签名设置模拟?

最佳答案

首先,提供的初始示例具有 orderBy参数为

Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy

但是在设置中有

It.IsAny<Func<IQueryable<Product>>>()

它不会匹配接口(interface)的定义并导致编译错误。

其次,使用It.IsAny<>可选参数允许模拟方法在执行测试时灵活。

下面用简单的例子来演示

[TestMethod]
public async Task DummyTest() {
//Arrange
var mock = new Mock<IGenericRepository>();
var expected = new List<Product>() { new Product() };
mock.Setup(_ => _.GetAllAsync<Product>(
It.IsAny<Func<IQueryable<Product>, IOrderedQueryable<Product>>>(),
It.IsAny<string>(),
It.IsAny<int?>(),
It.IsAny<int?>()
)).ReturnsAsync(expected);

var repository = mock.Object;

//Act
var actual = await repository.GetAllAsync<Product>(); //<--optional parameters excluded

//Assert
CollectionAssert.AreEqual(expected, actual.ToList());
}

关于c# - 无法为通用的 ienumerable 任务设置最小起订量模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43001058/

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