我对单元测试还比较陌生,现在我正在尝试为我创建的一个Web API控制器编写一个单元测试,该控制器返回品牌列表。
我的Web API控制器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);
}
通用仓库方法如下:
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>
方法。 - Nkosi