Replace Moq with NSubstitute (#51)

This commit is contained in:
2023-08-09 16:11:11 +02:00
committed by GitHub
parent fe049d4c00
commit b7244b2bdb
13 changed files with 101 additions and 132 deletions
@@ -1,6 +1,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
using Slim;
using System;
using System.Linq;
@@ -17,12 +18,12 @@ public sealed class HttpClientBuilderTests
private const string SomeValue = "SomeValue";
private readonly HttpClientBuilder<object> httpClientBuilder;
private readonly Mock<IServiceProducer> serviceProducerMock = new();
private readonly IServiceProducer serviceProducerMock = Substitute.For<IServiceProducer>();
private readonly Uri baseAddress = new("http://contoso.co");
public HttpClientBuilderTests()
{
this.httpClientBuilder = new HttpClientBuilder<object>(this.serviceProducerMock.Object);
this.httpClientBuilder = new HttpClientBuilder<object>(this.serviceProducerMock);
}
[TestMethod]
@@ -62,26 +63,25 @@ public sealed class HttpClientBuilderTests
{
var producer = this.httpClientBuilder.Build();
producer.Should().Be(this.serviceProducerMock.Object);
producer.Should().Be(this.serviceProducerMock);
}
[TestMethod]
public void Build_RegistersWithServiceProducer()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false));
this.httpClientBuilder.Build();
this.serviceProducerMock.Verify();
this.serviceProducerMock.Received().RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false);
}
[TestMethod]
public void Build_CreatesExpectedClient()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>((factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
client.BaseAddress.Should().BeNull();
client.DefaultRequestHeaders.Should().BeEmpty();
client.MaxResponseContentBufferSize.Should().Be(2147483647L);
@@ -89,15 +89,17 @@ public sealed class HttpClientBuilderTests
});
this.httpClientBuilder.Build();
}
[TestMethod]
public void Build_WithBaseAddress_ReturnsClientWithBaseAddress()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>((factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
client.BaseAddress.Should().Be(this.baseAddress);
});
@@ -108,12 +110,12 @@ public sealed class HttpClientBuilderTests
[TestMethod]
public void Build_WithDefaultRequestHeaders_CallsFactory()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>((factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
client.DefaultRequestHeaders.TryGetValues(SomeHeader, out var values);
values.Should().HaveCount(1);
values.FirstOrDefault().Should().Be(SomeValue);
});
@@ -127,10 +129,11 @@ public sealed class HttpClientBuilderTests
[TestMethod]
public void Build_WithMaxResponseBufferSize_ReturnsClientWithMaxResponseBufferSize()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>((factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
client.MaxResponseContentBufferSize.Should().Be(100);
});
@@ -141,10 +144,11 @@ public sealed class HttpClientBuilderTests
[TestMethod]
public void Build_WithTimeout_ReturnsClientWithTimeout()
{
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>((factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
client.Timeout.Should().Be(TimeSpan.FromSeconds(5));
});
@@ -156,10 +160,11 @@ public sealed class HttpClientBuilderTests
public void Build_WithMessageHandler_CallsMessageHandler()
{
var handlerMock = new HttpMessageHandlerMock();
this.serviceProducerMock.Setup(u => u.RegisterScoped(It.IsAny<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Callback<Func<Slim.IServiceProvider, IHttpClient<object>>, bool>(async (factory, _) =>
this.serviceProducerMock.When(u => u.RegisterScoped(Arg.Any<Func<Slim.IServiceProvider, IHttpClient<object>>>(), false))
.Do(async callInfo =>
{
var client = factory(new Mock<Slim.IServiceProvider>().Object);
var factory = callInfo.ArgAt<Func<Slim.IServiceProvider, IHttpClient<object>>>(0);
var client = factory(Substitute.For<Slim.IServiceProvider>());
await client.GetAsync(this.baseAddress);
handlerMock.Called.Should().BeTrue();
});
@@ -1,6 +1,6 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using NSubstitute;
using System;
using System.Net.Http;
@@ -10,7 +10,7 @@ namespace SystemExtensions.DependencyInjection.Tests.Http;
public class HttpClientResolverTests
{
private readonly HttpClientResolver httpClientResolver = new();
private readonly Mock<Slim.IServiceProvider> serviceProviderMock = new();
private readonly Slim.IServiceProvider serviceProviderMock = Substitute.For<Slim.IServiceProvider>();
[TestMethod]
public void CanResolve_IHttpClient_ReturnsTrue()
@@ -38,7 +38,7 @@ public class HttpClientResolverTests
[TestMethod]
public void Resolve_TypedClient_ReturnsIHttpClient()
{
var client = this.httpClientResolver.Resolve(this.serviceProviderMock.Object, typeof(IHttpClient<string>));
var client = this.httpClientResolver.Resolve(this.serviceProviderMock, typeof(IHttpClient<string>));
client.Should().BeAssignableTo<IHttpClient<string>>();
}
@@ -48,7 +48,7 @@ public class HttpClientResolverTests
{
Action action = new(() =>
{
this.httpClientResolver.Resolve(this.serviceProviderMock.Object, typeof(IHttpClient<>));
this.httpClientResolver.Resolve(this.serviceProviderMock, typeof(IHttpClient<>));
});
action.Should().Throw<Exception>();
@@ -59,7 +59,7 @@ public class HttpClientResolverTests
{
Action action = new(() =>
{
this.httpClientResolver.Resolve(this.serviceProviderMock.Object, typeof(string));
this.httpClientResolver.Resolve(this.serviceProviderMock, typeof(string));
});
action.Should().Throw<Exception>();