Comments (3)
Hi @Dreamescaper
I was looking for something similar and found your issue.
MockHttpClientFactory could be simpler.
My final solution:
MockHttpClientFactory:
using RichardSzalay.MockHttp;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
namespace Common.Utils.TestHelpers.HttpClient
{
public class MockHttpClientFactory : IHttpClientFactory
{
private readonly MockHttpMessageHandler _mockHttpMessageHandler;
public MockHttpClientFactory(MockHttpMessageHandler mockHttpMessageHandler)
{
_mockHttpMessageHandler = mockHttpMessageHandler ?? throw new ArgumentNullException(nameof(mockHttpMessageHandler));
}
public System.Net.Http.HttpClient CreateClient(string name)
{
return _mockHttpMessageHandler.ToHttpClient();
}
}
}
Extension:
using RichardSzalay.MockHttp;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
namespace Common.Utils.TestHelpers.HttpClient
{
public static class MockHttpMessageHandlerExtensions
{
public static IHttpClientFactory ToHttpClientFactory(this MockHttpMessageHandler mockHttpMessageHandler)
{
return new MockHttpClientFactory(mockHttpMessageHandler);
}
}
}
Using:
# ...
_apiClientLogic = new ApiClientLogic(_mockHttp.ToHttpClientFactory());
# ...
Regards
Mateusz
from mockhttp.
Pulling a dependency on IHttpClientFactory would reduce the libraries compatibility with older versions of the framework.
Another approach would be to overwrite individual HttpClient registrations. You add the following to yourWebApplicationFactory
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services => {
var mockHandler = new MockHttpMessageHandler();
// overwrite the default HttpClient i.e. services.AddHttpClient();
services.AddHttpClient(string.Empty)
.ConfigureHttpMessageHandlerBuilder(builder => builder.PrimaryHandler = mockHandler);
// overwrite a typed client
services.AddHttpClient<ITypedClient, TypedClient>()
.ConfigureHttpMessageHandlerBuilder(builder => builder.PrimaryHandler = mockHandler);
});
}
This approach also allows you to have a separate mock handler for each HTTP client which would probably make it easier to maintain. I would also make the mock handlers public properties on the WebApplicationFactory so that I could configure the responses on a per test basis.
from mockhttp.
As @gareth-evans noted, referencing IHttpClientFactory would reduce my framework support. However, I assume I'll inevitably drop support for the older framework anyway one day - when that happens I'll look at this again.
from mockhttp.
Related Issues (20)
- Documentation Request HOT 3
- Adding Response Headers
- Question: Matching Query with XML HOT 4
- Feature Request: Support BaseAddress and DefaultRequestHeaders HOT 3
- Not Compatible with Sync HttpClient Send HOT 4
- Matcher async support HOT 4
- PostAsync with When() returns NotFound - but only when an Expect() is also defined HOT 6
- How to add additional conditions to .When()? HOT 1
- HttpClientJsonExtensions.PostAsJsonAsync Throws NullReferenceException When Serializing the Property/Value Message = "Message:" HOT 2
- I'm unable to set the base address when using IHttpClientFactory? HOT 2
- Feature request: expose collected requests
- Feature request: OnRequestCompleted callback HOT 2
- Add a mechanism to set the BaseAddress of the resulting HttpClient HOT 8
- NullReferenceException if response is not configured. HOT 3
- requestExpectations queue not thread safe HOT 2
- Overwrite same endpoint with different result HOT 3
- Feature request: clear match counts HOT 4
- Can't Match Using WithFormData, WithHeaders HOT 5
- Library status HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mockhttp.