• About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us
TechTrendFeed
  • Home
  • Tech News
  • Cybersecurity
  • Software
  • Gaming
  • Machine Learning
  • Smart Home & IoT
No Result
View All Result
  • Home
  • Tech News
  • Cybersecurity
  • Software
  • Gaming
  • Machine Learning
  • Smart Home & IoT
No Result
View All Result
TechTrendFeed
No Result
View All Result

Updating to .NET 8, updating to IHostBuilder, and working Playwright Exams inside NUnit headless or headed on any OS

Admin by Admin
April 5, 2025
Home Software
Share on FacebookShare on Twitter



All the Unit Tests pass

I have been doing not simply Unit Testing for my websites however full on Integration Testing and Browser Automation Testing as early as 2007 with Selenium. Currently, nonetheless, I have been utilizing the quicker and customarily extra appropriate Playwright. It has one API and may take a look at on Home windows, Linux, Mac, domestically, in a container (headless), in my CI/CD pipeline, on Azure DevOps, or in GitHub Actions.

For me, it is that final second of reality to make it possible for the positioning runs fully from finish to finish.

I can write these Playwright assessments in one thing like TypeScript, and I may launch them with node, however I like working finish unit assessments and utilizing that take a look at runner and take a look at harness as my leaping off level for my .NET functions. I am used to proper clicking and “run unit assessments” and even higher, proper click on and “debug unit assessments” in Visible Studio or VS Code. This will get me the advantage of all the assertions of a full unit testing framework, and all the advantages of utilizing one thing like Playwright to automate my browser.

In 2018 I used to be utilizing WebApplicationFactory and a few difficult hacks to mainly spin up ASP.NET inside .NET (on the time) Core 2.1 throughout the unit assessments after which launching Selenium. This was form of janky and would require to manually begin a separate course of and handle its life cycle. Nevertheless, I saved on with this hack for numerous years mainly making an attempt to get the Kestrel Internet Server to spin up within my unit assessments.

I’ve just lately upgraded my primary website and podcast website to .NET 8. Needless to say I have been shifting my web sites ahead from early early variations of .NET to the newest variations. The weblog is fortunately working on Linux in a container on .NET 8, however its authentic code began in 2002 on .NET 1.1.

Now that I am on .NET 8, I scandalously found (as my unit assessments stopped working) that the remainder of the world had moved from IWebHostBuilder to IHostBuilder 5 model of .NET in the past. Gulp. Say what you’ll, however the backward compatibility is spectacular.

As such my code for Program.cs modified from this

public static void Major(string[] args)
{
CreateWebHostBuilder(args).Construct().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup();

to this:

public static void Major(string[] args)
{
CreateHostBuilder(args).Construct().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).
ConfigureWebHostDefaults(WebHostBuilder => WebHostBuilder.UseStartup());

Not a significant change on the surface however tidies issues up on the within and units me up with a extra versatile generic host for my internet app.

My unit assessments stopped working as a result of my Kestral Internet Server hack was not firing up my server.

Right here is an instance of my purpose from a Playwright perspective inside a .NET NUnit take a look at.

[Test]
public async Job DoesSearchWork()
{
await Web page.GotoAsync(Url);

await Web page.Locator("#topbar").GetByRole(AriaRole.Hyperlink, new() { Identify = "episodes" }).ClickAsync();

await Web page.GetByPlaceholder("search and filter").ClickAsync();

await Web page.GetByPlaceholder("search and filter").TypeAsync("spouse");

const string visibleCards = ".showCard:seen";

var ready = await Web page.WaitForSelectorAsync(visibleCards, new PageWaitForSelectorOptions() { Timeout = 500 });

await Count on(Web page.Locator(visibleCards).First).ToBeVisibleAsync();

await Count on(Web page.Locator(visibleCards)).ToHaveCountAsync(5);
}

I really like this. Good and clear. Actually right here we’re assuming that we now have a URL in that first line, which shall be localhost one thing, after which we assume that our internet software has began up by itself.

Right here is the setup code that begins my new “internet software take a look at builder manufacturing facility,” yeah, the title is silly but it surely’s descriptive. Word the OneTimeSetUp and the OneTimeTearDown. This begins my internet app throughout the context of my TestHost. Word the :0 makes the app discover a port which I then, sadly, should dig out and put into the Url non-public to be used inside my Unit Exams. Word that the is in truth my Startup class inside Startup.cs which hosts my app’s pipeline and Configure and ConfigureServices get setup right here so routing all works.

non-public string Url;
non-public WebApplication? _app = null;

[OneTimeSetUp]
public void Setup()
{
var builder = WebApplicationTestBuilderFactory.CreateBuilder();

var startup = new Startup(builder.Surroundings);
builder.WebHost.ConfigureKestrel(o => o.Pay attention(IPAddress.Loopback, 0));
startup.ConfigureServices(builder.Companies);
_app = builder.Construct();

// pay attention on any native port (therefore the 0)
startup.Configure(_app, _app.Configuration);
_app.Begin();

//you might be kidding me
Url = _app.Companies.GetRequiredService().Options.GetRequiredFeature().Addresses.Final();
}

[OneTimeTearDown]
public async Job TearDown()
{
await _app.DisposeAsync();
}

So what horrors are buried in WebApplicationTestBuilderFactory? The primary bit is unhealthy and we must always repair it for .NET 9. The remainder is definitely each good, with a hat tip to David Fowler for his assist and steerage! That is the magic and the ick in a single small helper class.

public class WebApplicationTestBuilderFactory 
{
public static WebApplicationBuilder CreateBuilder() the place T : class
{
//This ungodly code requires an unused reference to the MvcTesting bundle that hooks up
// MSBuild to create the manifest file that's learn right here.
var testLocation = Path.Mix(AppContext.BaseDirectory, "MvcTestingAppManifest.json");
var json = JsonObject.Parse(File.ReadAllText(testLocation));
var asmFullName = typeof(T).Meeting.FullName ?? throw new InvalidOperationException("Meeting Full Identify is null");
var contentRootPath = json?[asmFullName]?.GetValue();

//spin up an actual reside internet software inside TestHost.exe
var builder = WebApplication.CreateBuilder(
new WebApplicationOptions()
{
ContentRootPath = contentRootPath,
ApplicationName = asmFullName
});
return builder;
}
}

The primary 4 strains are nasty. As a result of the take a look at runs within the context of a distinct listing and my web site must run throughout the context of its personal content material root path, I’ve to drive the content material root path to be right and the one method to try this is by getting the apps base listing from a file generated inside MSBuild from the (getting old) MvcTesting bundle. The bundle isn’t used, however by referencing it it will get into the construct and makes that file that I then use to drag out the listing.

If we will do away with that “hack” and pull the listing from context elsewhere, then this helper perform turns right into a single line and .NET 9 will get WAY WAY extra testable!

Now I can run my Unit Exams AND Playwright Browser Integration Exams throughout all OS’s, headed or headless, in docker or on the steel. The location is up to date to .NET 8 and all is correct with my code. Nicely, it runs at the least. 😉




About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, marketing consultant, father, diabetic, and Microsoft worker. He’s a failed stand-up comedian, a cornrower, and a e-book writer.

facebook
bluesky
subscribe
About   Publication

Internet hosting By
Hosted on Linux using .NET in an Azure App Service








Tags: .NETheadedheadlessIHostBuilderNUnitPlaywrightrunningTestsUpdating
Admin

Admin

Next Post
HavenLock Releases 4th Gen Entry Management System in Collaboration With Alarm.com

HavenLock Releases 4th Gen Entry Management System in Collaboration With Alarm.com

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Trending.

Discover Vibrant Spring 2025 Kitchen Decor Colours and Equipment – Chefio

Discover Vibrant Spring 2025 Kitchen Decor Colours and Equipment – Chefio

May 17, 2025
Reconeyez Launches New Web site | SDM Journal

Reconeyez Launches New Web site | SDM Journal

May 15, 2025
Safety Amplified: Audio’s Affect Speaks Volumes About Preventive Safety

Safety Amplified: Audio’s Affect Speaks Volumes About Preventive Safety

May 18, 2025
Flip Your Toilet Right into a Good Oasis

Flip Your Toilet Right into a Good Oasis

May 15, 2025
Apollo joins the Works With House Assistant Program

Apollo joins the Works With House Assistant Program

May 17, 2025

TechTrendFeed

Welcome to TechTrendFeed, your go-to source for the latest news and insights from the world of technology. Our mission is to bring you the most relevant and up-to-date information on everything tech-related, from machine learning and artificial intelligence to cybersecurity, gaming, and the exciting world of smart home technology and IoT.

Categories

  • Cybersecurity
  • Gaming
  • Machine Learning
  • Smart Home & IoT
  • Software
  • Tech News

Recent News

Namal – Half 1: The Shattered Peace | by Javeria Jahangeer | Jul, 2025

Namal – Half 1: The Shattered Peace | by Javeria Jahangeer | Jul, 2025

July 9, 2025
Awakening Followers Are Combating A Useful resource Warfare With Containers

Awakening Followers Are Combating A Useful resource Warfare With Containers

July 9, 2025
  • About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us

© 2025 https://techtrendfeed.com/ - All Rights Reserved

No Result
View All Result
  • Home
  • Tech News
  • Cybersecurity
  • Software
  • Gaming
  • Machine Learning
  • Smart Home & IoT

© 2025 https://techtrendfeed.com/ - All Rights Reserved