Steve Desmond Steve Desmond - 4 months ago 84
ASP.NET (C#) Question

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

I have a VS solution with a "web" project (ASP.NET v5) and a "web.Tests" project (xunit.net 2.1beta) -- one of the tests is checking the rendered pages, and I'm trying to have the test bring up the site automatically, so I don't need to have it running 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();
}
}
}


The server starts and stops fine, but I get an HTTP 500 when I hit a page, with a System.InvalidOperationException:

A type named 'StartupProduction' or 'Startup' could not be found in assembly 'web.Tests'.


How do I specify that I want to run Startup.cs from the "web" project, not the "web.Tests" project?

Answer

This was fixed by switching to Kestrel as the host -- especially since Kestrel is now the only supported host in 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();
        }
    }
}

(obviously replacing the arguments in Path.Combine(...) with where your web app is located)