Sam*_*Sam 5 .net c# unit-testing mstest visual-studio-2017
我的 Visual Studio 2017 项目包含一些单元测试项目。所有这些测试都针对一个 ASP.NET Core 服务器运行。我想在所有测试之前启动一次 ASP.NET Core 服务器,并在所有测试之后关闭它。
我的主要测试项目包含一个用于启动测试服务器的类:
public class TestServer : IDisposable
{
public static string Url { get { return "http://localhost:44391/"; } }
private static string GetApplicationPath()
{
return Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "..", "..", "..", "..", "..", "src", "MyProject"));
}
public IWebHost BuildHost()
{
var config = new ConfigurationBuilder()
.AddEnvironmentVariables(prefix: "ASPNETCORE_")
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseEnvironment("UnitTests")
.UseKestrel()
.UseUrls(TestServer.Url)
.UseContentRoot(GetApplicationPath())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
return host;
}
private IWebHost _testserver;
public TestServer()
{
_testserver = BuildHost();
_testserver.Start();
}
#region IDisposable
~TestServer()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
bool _IsDisposed = false;
protected virtual void Dispose(bool disposeManagedResources)
{
if (this._IsDisposed)
return;
if (disposeManagedResources)
{
_testserver.Dispose();
}
this._IsDisposed = true;
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
为了启动测试服务器,我添加了这个辅助类:
public static class TestServerStaticHelper
{
static object LockServer = new object();
static int ServerCount = 0;
static TestServer _service;
public static void Attach()
{
lock (LockServer)
{
ServerCount++;
if (_service == null)
_service = new TestServer();
}
}
public static void Detach()
{
lock (LockServer)
{
ServerCount--;
if (ServerCount <= 0 && _service != null)
{
_service.Dispose();
_service = null;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我安装和拆卸从TestClass中包含的功能的服务[AssemblyInitialize()]和[AssemblyCleanup()]
[TestClass]
public class TestServerFixture
{
[AssemblyInitialize()]
public static void AssemblyInit(TestContext context)
{
TestServerStaticHelper.Attach();
}
[AssemblyCleanup()]
public static void AssemblyCleanup()
{
TestServerStaticHelper.Detach();
}
}
Run Code Online (Sandbox Code Playgroud)
这对我的主要测试程序集非常有效。但是,如果我添加另一个带有测试的程序集,其中包含用于 Assembly-Init 和 Cleanup 的 TestServerFixture,它们将不会共享该服务。相反,Visual Studio 测试将尝试启动服务两次。
我猜每个包含测试的项目/程序集都是在单独的应用程序域中启动的?
如何在多个测试程序集之间共享静态服务器/服务?
| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |