Implementing unit tests for ASP.NET Core Web APIs Unit testing involves testing a part of an application in isolation from its infrastructure and
dependencies. When you unit test controller logic, only the content of a single action or method is
tested, not the behavior of its dependencies or of the framework itself. Unit tests do not detect issues
in the interaction between components
—
that is the purpose of integration testing.
As you unit test your controller actions, make sure you focus only on their behavior. A controller unit
test avoids things like filters, routing, or model binding (the mapping of request data to a ViewModel
or DTO). Because they focus on testing just one thing, unit tests are generally simple to write and
quick to run. A well-written set of unit tests can be run frequently without much overhead.
Unit tests are implemented based on test frameworks like xUnit.net, MSTest, Moq, or NUnit. For the
eShopOnContainers sample application, we are using xUnit.
When you write a unit test for a Web API controller, you instantiate the controller class directly using
the new keyword in C#, so that the test will run as fast as possible. The following example shows how
to do this when using
xUnit
as the Test framework.
[Fact]
public async Task
Get_order_detail_success
()
{
//Arrange
var
fakeOrderId =
"12"
;
var
fakeOrder =
GetFakeOrder
();
//...
//Act
var
orderController =
new OrderController
(
_orderServiceMock.
Object
,
_basketServiceMock.
Object
,
_identityParserMock.
Object
);
orderController.
ControllerContext
.
HttpContext
= _contextMock.
Object
;
var
actionResult = await orderController.
Detail
(fakeOrderId);
//Assert
var
viewResult = Assert.
IsType
(actionResult);
Assert.
IsAssignableFrom
(viewResult.
ViewData
.
Model
);
}
154
CHAPTER 5 | Designing and Developing Multi-Container and Microservice-Based .NET Applications