Skip to content

Commit 454515b

Browse files
committed
Merge branch 'develop'
2 parents 9f7d37c + 9c82bbf commit 454515b

8 files changed

+182
-37
lines changed

src/Devlead.Testing.MockHttp.Tests/Devlead.Testing.MockHttp.Tests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@
2828
<PackageReference Include="NUnit3TestAdapter" />
2929
<PackageReference Include="Verify.NUnit" />
3030
<PackageReference Include="System.Text.Json" />
31+
<PackageReference Include="Verify.Http" />
3132
</ItemGroup>
3233

3334
<ItemGroup>
3435
<Using Include="NUnit.Framework" />
3536
</ItemGroup>
3637

3738
<ItemGroup>
38-
<ProjectReference Include="..\Devlead.Testing.MockHttp\Devlead.Testing.MockHttp.csproj" />
39+
<Compile Include="../Devlead.Testing.MockHttp/**/*.cs" Exclude="../Devlead.Testing.MockHttp/obj/**;../Devlead.Testing.MockHttp/bin/**" />
3940
</ItemGroup>
4041

4142
</Project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Devlead.Testing.MockHttp;
2+
using Devlead.Testing.MockHttp.Tests;
3+
using Devlead.Testing.MockHttp.Tests.Services;
4+
using Microsoft.Extensions.DependencyInjection;
5+
public static partial class ServiceProviderFixture
6+
{
7+
static partial void InitServiceProvider(IServiceCollection services)
8+
{
9+
services.AddSingleton<MyService>()
10+
.AddMockHttpClient<Constants>();
11+
}
12+
}

src/Devlead.Testing.MockHttp.Tests/Unit/HttpClientTests.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ public class HttpClientTests
99
public async Task GetAsync()
1010
{
1111
// Given
12-
var serviceCollection = new ServiceCollection();
13-
serviceCollection.AddMockHttpClient<Constants>();
14-
var serviceProvider = serviceCollection.BuildServiceProvider();
15-
var httpClient = serviceProvider.GetRequiredService<HttpClient>();
12+
var httpClient = ServiceProviderFixture.GetRequiredService<HttpClient>();
1613

1714
// When
1815
var response = await httpClient.GetAsync("https://example.com/index.txt");

src/Devlead.Testing.MockHttp.Tests/Unit/MyServiceTests.cs

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Devlead.Testing.MockHttp.Tests.Services;
2-
using Microsoft.Extensions.DependencyInjection;
32

43
namespace Devlead.Testing.MockHttp.Tests.Unit;
54

@@ -9,11 +8,7 @@ public class MyServiceTests
98
public async Task GetData()
109
{
1110
// Given
12-
var serviceCollection = new ServiceCollection()
13-
.AddSingleton<MyService>()
14-
.AddMockHttpClient<Constants>();
15-
var serviceProvider = serviceCollection.BuildServiceProvider();
16-
var myService = serviceProvider.GetRequiredService<MyService>();
11+
var myService = ServiceProviderFixture.GetRequiredService<MyService>();
1712

1813
// When
1914
var result = await myService.GetData();
@@ -26,11 +21,7 @@ public async Task GetData()
2621
public async Task GetUnauthorizedSecret()
2722
{
2823
// Given
29-
var serviceCollection = new ServiceCollection()
30-
.AddSingleton<MyService>()
31-
.AddMockHttpClient<Constants>();
32-
var serviceProvider = serviceCollection.BuildServiceProvider();
33-
var myService = serviceProvider.GetRequiredService<MyService>();
24+
var myService = ServiceProviderFixture.GetRequiredService<MyService>();
3425

3526
// When
3627
var result = Assert.CatchAsync<HttpRequestException>(myService.GetSecret);
@@ -43,16 +34,15 @@ public async Task GetUnauthorizedSecret()
4334
public async Task GetSecret()
4435
{
4536
// Given
46-
var serviceCollection = new ServiceCollection()
47-
.AddSingleton<MyService>()
48-
.AddMockHttpClient<Constants>(
49-
client => client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
50-
"Bearer",
51-
"AccessToken"
52-
)
53-
);
54-
var serviceProvider = serviceCollection.BuildServiceProvider();
55-
var myService = serviceProvider.GetRequiredService<MyService>();
37+
38+
var myService = ServiceProviderFixture.GetRequiredService<MyService>(
39+
configure => configure.ConfigureMockHttpClient<Constants>(
40+
client => client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
41+
"Bearer",
42+
"AccessToken"
43+
)
44+
)
45+
);
5646

5747
// When
5848
var result = await myService.GetSecret();

src/Devlead.Testing.MockHttp/Devlead.Testing.MockHttp.csproj

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,25 @@
66
<Nullable>enable</Nullable>
77
<PackageReadmeFile>README.md</PackageReadmeFile>
88
<PackageIcon>icon/devlead.testing.mockhttp.png</PackageIcon>
9+
<IsPackable>true</IsPackable>
10+
<PackBuildOutput>false</PackBuildOutput>
11+
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
12+
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
13+
<ContentTargetFolders>contentFiles</ContentTargetFolders>
914
</PropertyGroup>
1015
<ItemGroup>
16+
<PackageFile Condition="'$(Configuration)'!='Debug'" Include="**/*.cs" Exclude="obj/**;bin/**" PackagePath="$(ContentTargetFolders)\cs\$(TargetFramework)\Devlead\%(RelativeDir)%(Filename)%(Extension)" />
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<PackageReference Include="NuGetizer" PrivateAssets="all" />
1121
<PackageReference Include="Verify.Http" />
1222
</ItemGroup>
1323

1424
<ItemGroup>
15-
<None Include="../../icon/LICENSE.md" Pack="true" PackagePath="icon" />
16-
<None Include="../../icon/devlead.testing.mockhttp.png" Pack="true" PackagePath="icon" />
17-
<None Include="../../README.md" Pack="true" PackagePath="\" />
25+
<PackageFile Include="../../icon/LICENSE.md" PackagePath="icon/LICENSE.md" />
26+
<PackageFile Include="../../icon/devlead.testing.mockhttp.png" PackagePath="icon/devlead.testing.mockhttp.png" />
27+
<PackageFile Include="../../README.md" PackagePath="README.md" />
1828
</ItemGroup>
1929
</Project>
30+

src/Devlead.Testing.MockHttp/IServiceCollectionExtensions.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,31 @@ namespace Devlead.Testing.MockHttp;
66
public static class IServiceCollectionExtensions
77
{
88
public static IServiceCollection AddMockHttpClient<T>(
9-
this IServiceCollection services,
10-
Action<HttpClient>? action = null
9+
this IServiceCollection services
1110
)
1211
{
13-
MockHttpClient CreateClient()
12+
static MockHttpClient CreateClient(IServiceProvider provider)
1413
{
1514
var client = new MockHttpClient(Routes<T>.GetResponseBuilder());
16-
action?.Invoke(client);
15+
foreach(var service in provider.GetServices<ConfigureHttpClient<T>>())
16+
{
17+
service?.Invoke(client);
18+
}
1719
return client;
1820
}
1921

2022
return services
21-
.AddSingleton<HttpClient>(
22-
_ => CreateClient()
23-
)
23+
.AddSingleton<HttpClient>(CreateClient)
2424
.AddSingleton<IHttpClientFactory>(
25-
_ => new MockHttpClientFactory(CreateClient)
25+
provider => new MockHttpClientFactory(()=>CreateClient(provider))
2626
);
2727
}
28+
29+
public static IServiceCollection ConfigureMockHttpClient<T>(
30+
this IServiceCollection services,
31+
ConfigureHttpClient<T> configure
32+
)
33+
=> services.AddSingleton(configure);
34+
35+
public delegate void ConfigureHttpClient<T>(HttpClient client);
2836
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
3+
public static partial class ServiceProviderFixture
4+
{
5+
public static (T1, T2, T3, T4, T5, T6, T7) GetRequiredService<T1, T2, T3, T4, T5, T6, T7>(
6+
Func<IServiceCollection, IServiceCollection>? configure = null
7+
) where T1 : notnull
8+
where T2 : notnull
9+
where T3 : notnull
10+
where T4 : notnull
11+
where T5 : notnull
12+
where T6 : notnull
13+
where T7 : notnull
14+
{
15+
var provider = GetServiceProvider(configure);
16+
return (
17+
provider.GetRequiredService<T1>(),
18+
provider.GetRequiredService<T2>(),
19+
provider.GetRequiredService<T3>(),
20+
provider.GetRequiredService<T4>(),
21+
provider.GetRequiredService<T5>(),
22+
provider.GetRequiredService<T6>(),
23+
provider.GetRequiredService<T7>()
24+
);
25+
}
26+
public static (T1, T2, T3, T4, T5, T6) GetRequiredService<T1, T2, T3, T4, T5, T6>(
27+
Func<IServiceCollection, IServiceCollection>? configure = null
28+
) where T1 : notnull
29+
where T2 : notnull
30+
where T3 : notnull
31+
where T4 : notnull
32+
where T5 : notnull
33+
where T6 : notnull
34+
{
35+
var provider = GetServiceProvider(configure);
36+
return (
37+
provider.GetRequiredService<T1>(),
38+
provider.GetRequiredService<T2>(),
39+
provider.GetRequiredService<T3>(),
40+
provider.GetRequiredService<T4>(),
41+
provider.GetRequiredService<T5>(),
42+
provider.GetRequiredService<T6>()
43+
);
44+
}
45+
46+
public static (T1, T2, T3, T4, T5) GetRequiredService<T1, T2, T3, T4, T5>(
47+
Func<IServiceCollection, IServiceCollection>? configure = null
48+
) where T1 : notnull
49+
where T2 : notnull
50+
where T3 : notnull
51+
where T4 : notnull
52+
where T5 : notnull
53+
{
54+
var provider = GetServiceProvider(configure);
55+
return (
56+
provider.GetRequiredService<T1>(),
57+
provider.GetRequiredService<T2>(),
58+
provider.GetRequiredService<T3>(),
59+
provider.GetRequiredService<T4>(),
60+
provider.GetRequiredService<T5>()
61+
);
62+
}
63+
64+
65+
66+
public static (T1, T2, T3, T4) GetRequiredService<T1, T2, T3, T4>(
67+
Func<IServiceCollection, IServiceCollection>? configure = null
68+
) where T1 : notnull
69+
where T2 : notnull
70+
where T3 : notnull
71+
where T4 : notnull
72+
{
73+
var provider = GetServiceProvider(configure);
74+
return (
75+
provider.GetRequiredService<T1>(),
76+
provider.GetRequiredService<T2>(),
77+
provider.GetRequiredService<T3>(),
78+
provider.GetRequiredService<T4>()
79+
);
80+
}
81+
82+
public static (T1, T2, T3) GetRequiredService<T1, T2, T3>(
83+
Func<IServiceCollection, IServiceCollection>? configure = null
84+
) where T1 : notnull
85+
where T2 : notnull
86+
where T3 : notnull
87+
{
88+
var provider = GetServiceProvider(configure);
89+
return (
90+
provider.GetRequiredService<T1>(),
91+
provider.GetRequiredService<T2>(),
92+
provider.GetRequiredService<T3>()
93+
);
94+
}
95+
96+
public static (T1, T2) GetRequiredService<T1, T2>(
97+
Func<IServiceCollection, IServiceCollection>? configure = null
98+
) where T1 : notnull
99+
where T2 : notnull
100+
{
101+
var provider = GetServiceProvider(configure);
102+
return (
103+
provider.GetRequiredService<T1>(),
104+
provider.GetRequiredService<T2>()
105+
);
106+
}
107+
108+
public static T GetRequiredService<T>(
109+
Func<IServiceCollection, IServiceCollection>? configure = null
110+
) where T : notnull
111+
=> GetServiceProvider(configure)
112+
.GetRequiredService<T>();
113+
114+
public static ServiceProvider GetServiceProvider(Func<IServiceCollection, IServiceCollection>? configure)
115+
{
116+
var serviceCollection = new ServiceCollection();
117+
InitServiceProvider(serviceCollection);
118+
return (configure?.Invoke(serviceCollection) ?? serviceCollection).BuildServiceProvider();
119+
}
120+
121+
static partial void InitServiceProvider(IServiceCollection services);
122+
}

src/Directory.Packages.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
1313
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
1414
<PackageVersion Include="MimeTypes" Version="2.5.2" />
15+
<PackageVersion Include="NuGetizer" Version="1.2.4">
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
<PrivateAssets>all</PrivateAssets>
18+
</PackageVersion>
1519
<PackageVersion Include="NUnit" Version="4.2.2" />
1620
<PackageVersion Include="NUnit.Analyzers" Version="4.4.0" />
1721
<PackageVersion Include="NUnit3TestAdapter" Version="4.6.0" />

0 commit comments

Comments
 (0)