我对单元测试相当陌生,我正在尝试为我创建的 Web API Controller 创建一个单元测试,该 Controller 返回品牌列表。
我的 Web API Controller Get()
方法如下所示:
[HttpGet("/api/Brands/Get", Name = "GetBrands")]
public async Task<IActionResult> Get()
{
var brands = await _brandsService.GetAll(null, "Image");
return Json(brands);
}
通用服务方法如下所示:
public async Task<List<T>> GetAll(
Func<IQueryable<T>,
IOrderedQueryable<T>> orderBy = null,
string includeProperties = null)
{
return await _genericRepository.GetAll(orderBy, includeProperties);
}
通用的 repo 方法如下所示:
public async Task<T> Get<TKey>(Expression<Func<T, bool>> filter = null, string includeProperties = "", bool noTracking = false)
{
includeProperties = includeProperties.Trim() ?? string.Empty;
IQueryable<T> query = Context.Set<T>();
if (noTracking)
{
query.AsNoTracking();
}
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return await query.SingleOrDefaultAsync();
}
这正在起作用,我正在从数据库中返回品牌列表。
现在我尝试为此创建一个单元测试:
[SetUp]
public void Setup()
{
Brands = new List<Brand>
{
new Brand
{
Id = 1,
Name = "Adidas",
ImageId = 1
},
new Brand
{
Id = 2,
Name = "Nike",
ImageId = 2
},
new Brand
{
Id = 3,
Name = "Puma",
ImageId = 3
}
};
}
[Test]
public async Task Get_ReturnsAAListOfBrands()
{
//Arrange
var mockService = new Mock<IGenericService<Brand>>();
mockService.Setup(repo => repo.GetAll(null, null)).Returns(Task.FromResult(Brands));
var controller = new BrandsController(mockService.Object);
//Act
var result = await controller.Get();
//Assert
}
但是结果始终为空。我是否正确测试了这一点,或者我是否需要更改我的单元测试代码以验证模拟服务是否存储了三个项目?
最佳答案
您需要配置设置以期望测试的特定行为或参数。
在本例中使用It.IsAny<T>()
告诉设置在参数方面的期望将允许测试按需要进行。
鉴于 GetAll
方法需要两个参数
Func<IQueryable<T>, IOrderedQueryable<T>>
和string
,设置根据为这些参数输入的值来配置要执行的操作。
[Test]
public async Task Get_ReturnsAAListOfBrands() {
//Arrange
var mockService = new Mock<IGenericService<Brand>>();
mockService
.Setup(repo => repo.GetAll(It.IsAny<Func<IQueryable<Brand>, IOrderedQueryable<Brand>>>(), It.IsAny<string>()))
.ReturnsAsync(Brands);
var controller = new BrandsController(mockService.Object);
//Act
var result = await controller.Get();
//Assert
//...
}
看看Moq Quickstart为了更好地理解如何使用这个模拟框架
关于c# - 对 Web API Controller 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722191/