簡體   English   中英

在ASP.NET 5 / MVC 6上運行Selenium測試之前啟動IIS Express

[英]Starting IIS Express before running Selenium tests on ASP.NET 5 / MVC 6

我有一個帶有“web”項目的VS解決方案(ASP.NET v5)和一個“web.Tests”項目(xunit.net 2.1beta) - 其中一個測試是檢查渲染的頁面,我正在嘗試讓測試自動調出網站,所以我不需要單獨/手動運行。

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”項目運行Startup.cs,而不是“web.Tests”項目?

通過切換到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(...)的參數替換為您的Web應用程序所在的位置)

在使用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停止的技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM