Web API Controller Unit Testing

I am new to unit testing and am trying to create a unit test for the Web API controller I created that returns a list of brands.

My Web API controller's Get() method looks like this:

 [HttpGet("/api/Brands/Get", Name = "GetBrands")] public async Task<IActionResult> Get() { var brands = await _brandsService.GetAll(null, "Image"); return Json(brands); } 

The general service method is as follows:

 public async Task<List<T>> GetAll( Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = null) { return await _genericRepository.GetAll(orderBy, includeProperties); } 

and the universal repo method looks like this:

 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(); } 

This works, and I am returning a list of brands from the database.

Now I tried to create a unit test for this:

 [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 } 

however, the result is always zero. Am I testing this correctly or do I need to change the unit test code to make sure that three elements are stored in the service layout?

+8
source share
1 answer

You need to tweak the setting to expect a specific behavior or argument for the test.

In this case, using It.IsAny<T>() to tell the setup what to expect in terms of arguments will allow the test to proceed as desired.

Given that the GetAll method requires two parameters: Func<IQueryable<T>, IOrderedQueryable<T>> and string , the setting configures what to do based on the values ​​entered for these parameters.

 [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 //... } 

Check out Moq Quickstart to better understand how to use this mocking framework.

+3
source

Source: https://habr.com/ru/post/1014180/


All Articles