【问题标题】:Starting IIS Express before running Selenium tests on ASP.NET 5 / MVC 6在 ASP.NET 5 / MVC 6 上运行 Selenium 测试之前启动 IIS Express
【发布时间】:2015-07-29 00:17:15
【问题描述】:

我有一个带有“web”项目(ASP.NET v5)和一个“web.Tests”项目(xunit.net 2.1beta)的 VS 解决方案——其中一项测试是检查呈现的页面,我'我试图让测试自动启动站点,所以我不需要单独/手动运行它。

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?

【问题讨论】:

  • 哇,这个问题让我得到了风滚草徽章——显然它太棒了!

标签: asp.net selenium asp.net-core asp.net-core-mvc


【解决方案1】:

通过切换到 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(...) 中的参数替换为您的网络应用所在的位置)

【讨论】:

  • 你能分享你用来启动红隼的代码吗?
  • 谢谢。你怎么阻止它?直接终止进程还是实际上发送“ctrl+c”?
  • 是的,捕获该进程,然后在处置时将其杀死——请参阅更新的 sn-p
【解决方案2】:

在对 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 停止的诀窍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2016-03-29
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多