增加支持Autofac的http单元测试

This commit is contained in:
yubaolee
2022-03-30 23:21:37 +08:00
parent f8b0c1b3b7
commit bfdbb2b3b2
5 changed files with 127 additions and 1 deletions

View File

@@ -28,7 +28,7 @@ namespace OpenAuth.App.Test
//读取OpenAuth.WebApi的配置文件用于单元测试
var path = AppContext.BaseDirectory;
int pos = path.IndexOf("OpenAuth.App");
if (pos == -1) //如果测试入是OpenAuth.WebApi
if (pos == -1) //如果测试入是OpenAuth.WebApi
{
pos = path.IndexOf("OpenAuth.WebApi");
}

View File

@@ -29,6 +29,7 @@
<PackageReference Include="log4net" Version="2.0.12" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />

View File

@@ -0,0 +1,18 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.Hosting;
namespace OpenAuth.WebApi.Test
{
/// <summary>
/// Based upon https://github.com/dotnet/AspNetCore.Docs/tree/master/aspnetcore/test/integration-tests/samples/3.x/IntegrationTestsSample
/// </summary>
/// <typeparam name="TStartup"></typeparam>
public class AutofacWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override IHost CreateHost(IHostBuilder builder)
{
builder.UseServiceProviderFactory(new CustomServiceProviderFactory());
return base.CreateHost(builder);
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
namespace OpenAuth.WebApi.Test
{
/// <summary>
/// Based upon https://github.com/dotnet/aspnetcore/issues/14907#issuecomment-620750841 - only necessary because of an issue in ASP.NET Core
/// </summary>
public class CustomServiceProviderFactory : IServiceProviderFactory<ContainerBuilder>
{
private AutofacServiceProviderFactory _wrapped;
private IServiceCollection _services;
public CustomServiceProviderFactory()
{
_wrapped = new AutofacServiceProviderFactory();
}
public ContainerBuilder CreateBuilder(IServiceCollection services)
{
// Store the services for later.
_services = services;
return _wrapped.CreateBuilder(services);
}
public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder)
{
var sp = _services.BuildServiceProvider();
#pragma warning disable CS0612 // Type or member is obsolete
var filters = sp.GetRequiredService<IEnumerable<IStartupConfigureContainerFilter<ContainerBuilder>>>();
#pragma warning restore CS0612 // Type or member is obsolete
foreach (var filter in filters)
{
filter.ConfigureContainer(b => { })(containerBuilder);
}
return _wrapped.CreateServiceProvider(containerBuilder);
}
}
}

View File

@@ -0,0 +1,61 @@
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Autofac;
using Infrastructure;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using NUnit.Framework;
using OpenAuth.App;
using OpenAuth.App.SSO;
namespace OpenAuth.WebApi.Test
{
/// <summary>
/// 模拟HTTP请求测试
/// </summary>
public class TestHttpRequest
{
private HttpClient _client;
void ConfigureTestServices(IServiceCollection services)
{
services.AddSingleton("");
}
void ConfigureTestContainer(ContainerBuilder builder)
{
AutofacExt.InitAutofac(builder);
}
[SetUp]
public void Init()
{
var factory = new AutofacWebApplicationFactory<Startup>();
_client = factory
.WithWebHostBuilder(builder => {
builder.ConfigureTestServices(ConfigureTestServices);
builder.ConfigureTestContainer<ContainerBuilder>(ConfigureTestContainer);
})
.CreateClient();
}
[Test]
public void TestLogin()
{
var loginreq = new PassportLoginRequest
{
Account = "System",
Password = "123456",
AppKey = "openauth"
};
// Act
var request = new StringContent(JsonHelper.Instance.Serialize(loginreq));
request.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
var response = _client.PostAsync("/api/Check/Login", request);
Console.WriteLine($"返回结果:{response.Result.Content}");
}
}
}