【发布时间】:2017-06-02 23:53:02
【问题描述】:
我是单元测试的新手,我正在尝试为我创建的返回品牌列表的 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);
}
通用 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
}
但结果始终为空。我是否对此进行了正确测试,还是需要更改我的单元测试代码以验证模拟服务是否存储了三个项目?
【问题讨论】:
-
我认为您需要设置 query.SingleOrDefaultAsync() 的返回,尽管您需要检查如何执行此操作,因为查询未传递给构造函数。这个问题可能会有所帮助stackoverflow.com/questions/41611795/…
-
谢谢@Alex 我会检查这个问题
-
是的,我遇到了同样的问题,GetAll(null,null) 似乎没有在调试器中受到影响
-
如果参数对测试没有影响,请使用
It.IsAny<T>方法 -
@Johann 调试器不会进入方法,需要用setup模拟返回值。
标签: c# unit-testing asp.net-web-api nunit moq