我正在使用模拟库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
因此它将编译并且它将返回产品列表。它返回产品列表的期望行为。
任何人都可以帮我设置带有此签名的模拟器吗?
答案 0 :(得分:3)
首先,提供的初始示例将orderBy
参数设为
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy
但在设置中有
It.IsAny<Func<IQueryable<Product>>>()
与接口的定义不匹配并导致编译错误。
其次,使用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());
}