Using WireMock.NET in Functional testing in ASP.NET WEB API
WebAPI
18 Articles
In this article, let's learn about how to use WireMock.NET
in
Functional Test
in WebAPI
in ASP.NET Core.
Note: If you have not done so already, I recommend you read the article on Faking Dependencies in Functional testing in ASP.NET WEB API.
Table of Contents
Introduction
In our previous article we saw how to replace services in functional test and that approach has a drawback of writing lot of code to test all the
possible scenarios especially if you are writing fake services for sake of tests. We can overcome this drawback by using
WireMock.NET
. It helps us to simplify the test code and also helps us to test all the possible scenarios.
In this article, we'll learn about how to use WireMock.NET
in functional test.
Let's start by adding Task<WeatherForecast> GetWeatherForecast()
to our
IExternalAPIService
and implement it in ExternalAPIService
. Before we dive
into this implementation, lets first add URL and HttpClient
configuration in our Program.cs
.
Code Sample - App Settings for External API Call in Web API
Now in the Program.cs
, lets register IExternalService
with
ExternalService
add the HttpClient
configuration as shown below.
Code Sample - ExtrenalService Registration and HTTP Client Configuration
Now all we need to do is to inject the above WeatherClient HTTP Client
inside our
ExternalAPIService
and make a call to get weather information as shown below.
Code Sample - External API call to get weather information
Next we need to call the GetWeatherForecast
method from our WeatherForecastController
as shown below.
Here is the swagger response from the GetWeatherForecastFromAPI
endpoint.
Why to use WireMock.NET ?
WireMock.NET
is a powerful tool that can accurately emulate the behavior of an HTTP API
by capturing incoming requests and directing them to a WireMock.NET HTTP server
. This capability grants us the
ability to define expectations, call the API, and verify its behavior, making it ideal for extensive testing of code interactions with external services.
With WireMock.NET, we can effectively mock real API endpoints and utilize its comprehensive features for HTTP response stubbing,
including matching stubs based on URL/Path, headers, cookies, and body content patterns
.
The benefits of using WireMock.NET in functional tests include:
No need to write lot of mock code for HTTP calls
. WireMock.NET helps to test actual behavior.- WireMock.NET helps when
External API calls have rate limitation
. Easy to setup
and cover all possible status code behaviors.
Implementing WireMock.NET
We will be using the same project we used in the previous article and try adding WireMock.NET setup
. The steps
to implement WireMock.NET in functional test are as follows:
Add reference to
WireMock.NET
Nuget Package inFunctionalTest.csproj
.Setup
SharedFixture
as shown belowCode Sample - Shared Fixture for WireMock.NET setup in Function Test in ASP.NET
In the above code, we are
initializing
theWireMockServer
and getting theServer Base URL
from the WireMockServer and exposing it to be used inConfigureAppConfiguration
inCustomWebApiFactory
tooverride
with this URL. We can also configureSSL
,port
, etc during initialization here. We are alsodisposing
the WireMockServer after all tests are run.Now override the
Configuration
inWebHostBuilder
insideCustomWebApiFactory
inFunctionalTest.cs
as shown below.Code Sample - Override Configuration in Functional Test
-
Before we run the test, we need to modify
BastTest
to exposeWireMockServer
to setup HTTP response for ExtrenalAPI result. This is shown in the below code.Code Sample - Expose Weather Service in BaseTest
-
Now we need to
setup response
from the WireMock.NET server to be used in test. For that we need to add the following setup code as shown belowCode Sample - WireMock ExternalAPI Fixture to respond to API Calls
The above
setup
is responsible to do request matching particularPath
in WireMock.NET server and also the response to be returned usingBodyAsJson
. With this setup when we call External API in Functional Test WireMock kicks in and when the path matches, it will give the expected response to beasserted
in test.You can refer to the
WireMock.NET
documentation for more details on how to setup the request and response for various cases like timeouts, auth failure, etc. -
Now we are left with our test. So lets add the test as shown below.
Code Sample - Get From API Functional Test using WireMock.NET
In the above code if you notice, we are returning Temperature value as 18 from WireMockServer response and using it to assert in the test.
Thats it. We are done with setup. Now the tests will run in the following flow.
- Start Test Method.
- WireMockServer Setup.
- Create WebApplicationFactory.
- Run Program.cs.
- Service Registration.
- Overriding Configuration.
- Build Web Application.
- Create HTTP Client.
- Test Code Execution.
Now lets run the test and see the result.
Summary
In this article, we learnt about how to use WireMock.NET
in functional test in ASP.NET Web API. We also saw the
benefits of using WireMock.NET
in functional test. The complete source code for this article can be found
here. Hope you find this information useful.
In our next article we will continue to learn how to setup Authentication
in Functional Test in ASP.NET Web API.