NUnit with ASP.NET Website

I am currently trying to upgrade our build server at work, moving from the lack of a build server to it!

I use JetBrains TeamCity (using ReSharper for several years, I trust their materials) and intend to use NUnit and MSBuild .

However, I had a problem: it seems like it is not possible to validate an ASP.NET website using NUnit. I suggested that you could configure it to test App_Code after the build, however it seems that the only way to do the tests well is to convert the website into a web application (which my boss doesn't like the idea).

How can i do this?

Please keep in mind that testing should automatically start from TeamCity.

+4
source share
1 answer
  • If you want to smoke test your site or hit some endpoints - see the code below.

  • If, on the other hand, you want to test an unchecked (disgusting) assembly of an ASP.NET website (as opposed to a web application), you, as they say in France, SOL

An assembly is a dynamically compiled assembly, consisting of a randomly compiled assembly deep in temporary ASP.NET files, which makes testing almost impossible.

You really need to consider several options:

  • put the logic that needs to be tested in a separate assembly.
  • Modify the web application project that provides the assembly under test.

Sorry, I don’t think you will find what you are looking for, but I could be wrong. We will see.

Luck


Download the Visual Studio 2008 sample with the site and app .

I wrote a wrapper for WebHost.WebServer.dll , which is the core of a development server that works well in

WebHostServer.cs

 // Project: Salient // http://salient.codeplex.com // Date: April 16 2010 using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Threading; using Microsoft.VisualStudio.WebHost; namespace Salient.Excerpts { /// <summary> /// A general purpose Microsoft.VisualStudio.WebHost.Server test fixture. /// WebHost.Server is the core of the Visual Studio Development Server (WebDev.WebServer). /// /// This server is run in-process and may be used in F5 debugging. /// </summary> /// <remarks> /// If you are adding this source code to a new project, You will need to /// manually add a reference to WebDev.WebHost.dll to your project. It cannot /// be added from within Visual Studio. /// /// Please see the Readme.txt accompanying this code for details. /// </remarks> /// NOTE: code from various namespaces/classes in the Salient project have been merged into this /// single class for this post in the interest of brevity public class WebHostServer { private Server _server; public string ApplicationPath { get; private set; } public string HostName { get; private set; } public int Port { get; private set; } public string VirtualPath { get; private set; } public string RootUrl { get { return string.Format(CultureInfo.InvariantCulture, "http://{0}:{1}{2}", HostName, Port, VirtualPath); } } /// <summary> /// Combine the RootUrl of the running web application with the relative url specified. /// </summary> public virtual Uri NormalizeUri(string relativeUrl) { return new Uri(RootUrl + relativeUrl); } /// <summary> /// Will start "localhost" on first available port in the range 8000-10000 with vpath "/" /// </summary> /// <param name="applicationPath"></param> public void StartServer(string applicationPath) { StartServer(applicationPath, GetAvailablePort(8000, 10000, IPAddress.Loopback, true), "/", "localhost"); } /// <summary> /// </summary> /// <param name="applicationPath">Physical path to application.</param> /// <param name="port">Port to listen on.</param> /// <param name="virtualPath">Optional. defaults to "/"</param> /// <param name="hostName">Optional. Is used to construct RootUrl. Defaults to "localhost"</param> public void StartServer(string applicationPath, int port, string virtualPath, string hostName) { if (_server != null) { throw new InvalidOperationException("Server already started"); } // WebHost.Server will not run on any other IP IPAddress ipAddress = IPAddress.Loopback; if(!IsPortAvailable(ipAddress, port)) { throw new Exception(string.Format("Port {0} is in use.", port)); } applicationPath = Path.GetFullPath(applicationPath); virtualPath = String.Format("/{0}/", (virtualPath ?? string.Empty).Trim('/')).Replace("//", "/"); _server = new Server(port, virtualPath, applicationPath, false, false); _server.Start(); ApplicationPath = applicationPath; Port = port; VirtualPath = virtualPath; HostName = string.IsNullOrEmpty(hostName) ? "localhost" : hostName; } /// <summary> /// Stops the server. /// </summary> public void StopServer() { if (_server != null) { _server.Stop(); _server = null; // allow some time to release the port Thread.Sleep(100); } } public void Dispose() { StopServer(); } /// <summary> /// Gently polls specified IP:Port to determine if it is available. /// </summary> /// <param name="ipAddress"></param> /// <param name="port"></param> public static bool IsPortAvailable(IPAddress ipAddress, int port) { bool portAvailable = false; for (int i = 0; i < 5; i++) { portAvailable = GetAvailablePort(port, port, ipAddress, true) == port; if (portAvailable) { break; } // be a little patient and wait for the port if necessary, // the previous occupant may have just vacated Thread.Sleep(100); } return portAvailable; } /// <summary> /// Returns first available port on the specified IP address. /// The port scan excludes ports that are open on ANY loopback adapter. /// /// If the address upon which a port is requested is an 'ANY' address all /// ports that are open on ANY IP are excluded. /// </summary> /// <param name="rangeStart"></param> /// <param name="rangeEnd"></param> /// <param name="ip">The IP address upon which to search for available port.</param> /// <param name="includeIdlePorts">If true includes ports in TIME_WAIT state in results. /// TIME_WAIT state is typically cool down period for recently released ports.</param> /// <returns></returns> public static int GetAvailablePort(int rangeStart, int rangeEnd, IPAddress ip, bool includeIdlePorts) { IPGlobalProperties ipProps = IPGlobalProperties.GetIPGlobalProperties(); // if the ip we want a port on is an 'any' or loopback port we need to exclude all ports that are active on any IP Func<IPAddress, bool> isIpAnyOrLoopBack = i => IPAddress.Any.Equals(i) || IPAddress.IPv6Any.Equals(i) || IPAddress.Loopback.Equals(i) || IPAddress.IPv6Loopback. Equals(i); // get all active ports on specified IP. List<ushort> excludedPorts = new List<ushort>(); // if a port is open on an 'any' or 'loopback' interface then include it in the excludedPorts excludedPorts.AddRange(from n in ipProps.GetActiveTcpConnections() where n.LocalEndPoint.Port >= rangeStart && n.LocalEndPoint.Port <= rangeEnd && ( isIpAnyOrLoopBack(ip) || n.LocalEndPoint.Address.Equals(ip) || isIpAnyOrLoopBack(n.LocalEndPoint.Address)) && (!includeIdlePorts || n.State != TcpState.TimeWait) select (ushort)n.LocalEndPoint.Port); excludedPorts.AddRange(from n in ipProps.GetActiveTcpListeners() where n.Port >= rangeStart && n.Port <= rangeEnd && ( isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address)) select (ushort)n.Port); excludedPorts.AddRange(from n in ipProps.GetActiveUdpListeners() where n.Port >= rangeStart && n.Port <= rangeEnd && ( isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address)) select (ushort)n.Port); excludedPorts.Sort(); for (int port = rangeStart; port <= rangeEnd; port++) { if (!excludedPorts.Contains((ushort)port)) { return port; } } return 0; } } } 

NOTE. The Microsoft.VisualStudio.WebHost namespace is contained in the WebDev.WebHost.dll file. This file is located in the GAC, but it is not possible to add a link to this assembly from Visual Studio.

To add a link, you will need to open the .csproj file in a text editor and add the link manually.

Find the ItemGroup that contains the links to the project, and add the following element:

 <Reference Include="WebDev.WebHost, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86"> <Private>False</Private> </Reference> 

Link:

+8
source

Source: https://habr.com/ru/post/1308778/


All Articles