在 运行 Selenium 测试 ASP.NET 5 / MVC 6 之前启动 IIS Express
Starting IIS Express before running Selenium tests on ASP.NET 5 / MVC 6
我有一个带有 "web" 项目(ASP.NET v5)和一个 "web.Tests" 项目(xunit.net 2.1beta)的 VS 解决方案——其中一项测试是检查呈现的页面,我试图让测试自动打开网站,所以我不需要它 运行ning separately/manually.
namespace web.Tests
{
public abstract class BrowserTest : IDisposable
{
protected readonly IisExpress server;
protected readonly IWebDriver driver;
protected BrowserTest()
{
var project = ProjectLocation.FromPath(Path.Combine(SolutionRoot, "src", "web", "wwwroot"));
var app = new WebApplication(project, 8080);
server = new IisExpress(app);
server.Start();
driver = new PhantomJSDriver();
}
public void Dispose()
{
server.Stop();
}
}
}
服务器启动和停止正常,但是当我点击一个页面时我得到一个 HTTP 500,带有 System.InvalidOperationException:
A type named 'StartupProduction' or 'Startup' could not be found in assembly 'web.Tests'.
如何指定我想从 "web" 项目而不是 "web.Tests" 项目 运行 Startup.cs?
通过切换到 Kestrel 作为主机解决了这个问题 -- 特别是因为 Kestrel 现在是 ASP.NET 5
中唯一受支持的主机
using System;
using System.Diagnostics;
using System.IO;
using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;
namespace Test
{
public abstract class PhantomFixture : IDisposable
{
public readonly IWebDriver driver;
private readonly Process server;
protected PhantomFixture()
{
server = Process.Start(new ProcessStartInfo
{
FileName = "dnx.exe",
Arguments = "web",
WorkingDirectory = Path.Combine(Directory.GetCurrentDirectory(), "..", "Web")
});
driver = new PhantomJSDriver();
}
public void Dispose()
{
server.Kill();
driver.Dispose();
}
}
}
(显然将 Path.Combine(...)
中的参数替换为您的网络应用所在的位置)
在使用 DotNet Core 进行一些试验和错误之后,这就是我想出的。请注意,我的路径与您的略有不同,因为我将测试项目与 Web 项目分开了。
private System.Diagnostics.Process _WebServerProcess;
[OneTimeSetUp]
public void SetupTest()
{
_WebServerProcess = new System.Diagnostics.Process
{
EnableRaisingEvents = false,
StartInfo = {
WorkingDirectory = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "MyWebProjectName"),
FileName = $"dotnet.exe",
Arguments = " run"
}
};
}
private void KillWebServer()
{
IEnumerable<Process> processes = Process.GetProcesses()
.Where(p => p.ProcessName == "MyWebProjectName.exe" && p.HasExited == false)
.AsEnumerable();
foreach (Process process in processes)
process.Kill();
if (_WebServerProcess != null)
{
if (!_WebServerProcess.HasExited)
_WebServerProcess.Kill();
_WebServerProcess = null;
}
}
public void Dispose()
{
KillWebServer();
}
杀死启动的进程(例如,DotNet.exe 和 webproject exe)似乎是确保 Kestral 停止的技巧。
我有一个带有 "web" 项目(ASP.NET v5)和一个 "web.Tests" 项目(xunit.net 2.1beta)的 VS 解决方案——其中一项测试是检查呈现的页面,我试图让测试自动打开网站,所以我不需要它 运行ning separately/manually.
namespace web.Tests
{
public abstract class BrowserTest : IDisposable
{
protected readonly IisExpress server;
protected readonly IWebDriver driver;
protected BrowserTest()
{
var project = ProjectLocation.FromPath(Path.Combine(SolutionRoot, "src", "web", "wwwroot"));
var app = new WebApplication(project, 8080);
server = new IisExpress(app);
server.Start();
driver = new PhantomJSDriver();
}
public void Dispose()
{
server.Stop();
}
}
}
服务器启动和停止正常,但是当我点击一个页面时我得到一个 HTTP 500,带有 System.InvalidOperationException:
A type named 'StartupProduction' or 'Startup' could not be found in assembly 'web.Tests'.
如何指定我想从 "web" 项目而不是 "web.Tests" 项目 运行 Startup.cs?
通过切换到 Kestrel 作为主机解决了这个问题 -- 特别是因为 Kestrel 现在是 ASP.NET 5
中唯一受支持的主机using System;
using System.Diagnostics;
using System.IO;
using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;
namespace Test
{
public abstract class PhantomFixture : IDisposable
{
public readonly IWebDriver driver;
private readonly Process server;
protected PhantomFixture()
{
server = Process.Start(new ProcessStartInfo
{
FileName = "dnx.exe",
Arguments = "web",
WorkingDirectory = Path.Combine(Directory.GetCurrentDirectory(), "..", "Web")
});
driver = new PhantomJSDriver();
}
public void Dispose()
{
server.Kill();
driver.Dispose();
}
}
}
(显然将 Path.Combine(...)
中的参数替换为您的网络应用所在的位置)
在使用 DotNet Core 进行一些试验和错误之后,这就是我想出的。请注意,我的路径与您的略有不同,因为我将测试项目与 Web 项目分开了。
private System.Diagnostics.Process _WebServerProcess;
[OneTimeSetUp]
public void SetupTest()
{
_WebServerProcess = new System.Diagnostics.Process
{
EnableRaisingEvents = false,
StartInfo = {
WorkingDirectory = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "MyWebProjectName"),
FileName = $"dotnet.exe",
Arguments = " run"
}
};
}
private void KillWebServer()
{
IEnumerable<Process> processes = Process.GetProcesses()
.Where(p => p.ProcessName == "MyWebProjectName.exe" && p.HasExited == false)
.AsEnumerable();
foreach (Process process in processes)
process.Kill();
if (_WebServerProcess != null)
{
if (!_WebServerProcess.HasExited)
_WebServerProcess.Kill();
_WebServerProcess = null;
}
}
public void Dispose()
{
KillWebServer();
}
杀死启动的进程(例如,DotNet.exe 和 webproject exe)似乎是确保 Kestral 停止的技巧。