Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions TUnit.AspNetCore/TestWebApplicationFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,13 @@ public WebApplicationFactory<TEntryPoint> GetIsolatedFactory(
TestContext testContext,
WebApplicationTestOptions options,
Action<IServiceCollection> configureIsolatedServices,
Action<IConfigurationBuilder> configureIsolatedStartupConfiguration,
Action<WebHostBuilderContext, IConfigurationBuilder> configureIsolatedAppConfiguration,
Action<IWebHostBuilder>? configureWebHostBuilder = null)
{
return WithWebHostBuilder(builder =>
{
var configurationBuilder = new ConfigurationManager();
ConfigureStartupConfiguration(configurationBuilder);
configureIsolatedStartupConfiguration(configurationBuilder);

foreach (var keyValuePair in configurationBuilder.AsEnumerable())
{
Expand Down
1 change: 0 additions & 1 deletion TUnit.AspNetCore/WebApplicationTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@ public async Task InitializeFactoryAsync(TestContext testContext)
testContext,
_options,
ConfigureTestServices,
ConfigureTestConfiguration,
(_, config) => ConfigureTestConfiguration(config),
ConfigureWebHostBuilder));

Expand Down
18 changes: 9 additions & 9 deletions TUnit.Example.Asp.Net.TestProject/FactoryMethodOrderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace TUnit.Example.Asp.Net.TestProject;
///
/// This allows:
/// - Factory to provide base configuration shared across tests
/// - Tests to override factory defaults via ConfigureTestConfiguration (order 5)
/// - Tests to override factory defaults via ConfigureTestConfiguration (order 6)
/// </summary>
public class FactoryMethodOrderTests : TestsBase
{
Expand Down Expand Up @@ -105,16 +105,16 @@ await Assert.That(ConfigureTestServicesCalledOrder)
}

[Test]
[DisplayName("Complete relative execution order: Options → Setup → ConfigWebHost → Services → Startup")]
[DisplayName("Complete relative execution order: Options → Setup → WebHostConfig → Services → Startup")]
public async Task Full_Relative_Order()
{
_ = Factory.CreateClient();

// Verify all hooks were called
await Assert.That(ConfigureTestOptionsCalledOrder).IsGreaterThan(0);
await Assert.That(SetupCalledOrder).IsGreaterThan(0);
await Assert.That(ConfigureTestConfigurationCalledOrder).IsGreaterThan(0);
await Assert.That(ConfigureWebHostBuilderCalledOrder).IsGreaterThan(0);
await Assert.That(ConfigureTestConfigurationCalledOrder).IsGreaterThan(0);
await Assert.That(ConfigureTestServicesCalledOrder).IsGreaterThan(0);
await Assert.That(StartupCalledOrder).IsGreaterThan(0);

Expand All @@ -124,16 +124,16 @@ await Assert.That(ConfigureTestOptionsCalledOrder)
.Because("ConfigureTestOptions runs before SetupAsync");

await Assert.That(SetupCalledOrder)
.IsLessThan(ConfigureTestConfigurationCalledOrder)
.Because("SetupAsync runs before ConfigureTestConfiguration");

await Assert.That(ConfigureTestConfigurationCalledOrder)
.IsLessThan(ConfigureWebHostBuilderCalledOrder)
.Because("ConfigureTestConfiguration runs before ConfigureWebHostBuilder");
.Because("SetupAsync runs before ConfigureWebHostBuilder");

await Assert.That(ConfigureWebHostBuilderCalledOrder)
.IsLessThan(ConfigureTestConfigurationCalledOrder)
.Because("ConfigureWebHostBuilder runs before ConfigureTestConfiguration");

await Assert.That(ConfigureTestConfigurationCalledOrder)
.IsLessThan(ConfigureTestServicesCalledOrder)
.Because("ConfigureWebHostBuilder runs before ConfigureTestServices");
.Because("ConfigureTestConfiguration runs before ConfigureTestServices");

await Assert.That(ConfigureTestServicesCalledOrder)
.IsLessThan(StartupCalledOrder)
Expand Down
9 changes: 2 additions & 7 deletions TUnit.Example.Asp.Net.TestProject/TestsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,8 @@ protected override void ConfigureTestServices(IServiceCollection services)

protected override void ConfigureTestConfiguration(IConfigurationBuilder config)
{
// Track first call only (this method is called twice - once for startup config, once for app config)
if (ConfigureTestConfigurationCalledOrder == 0)
{
ConfigureTestConfigurationCalledOrder = GetNextOrder();
ConfigureTestConfigurationCalledAt = DateTime.UtcNow;
}

ConfigureTestConfigurationCalledOrder = GetNextOrder();
ConfigureTestConfigurationCalledAt = DateTime.UtcNow;
base.ConfigureTestConfiguration(config);
}

Expand Down
16 changes: 8 additions & 8 deletions docs/docs/examples/aspnet.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,8 @@ Understanding the execution order is critical for writing correct tests. Here's
│ 3. Factory.ConfigureWebHost Base factory configuration │
│ 4. Factory.ConfigureStartup... Base factory startup config │
│ ─────────────────────────────────────────────────────────── │
│ 5. ConfigureTestConfiguration Test config (overrides factory) │
│ 6. ConfigureWebHostBuilder Escape hatch (low-level access) │
│ 5. ConfigureWebHostBuilder Escape hatch (low-level access) │
│ 6. ConfigureTestConfiguration Test config (overrides factory) │
│ 7. ConfigureTestServices Test services (overrides) │
│ ─────────────────────────────────────────────────────────── │
│ 8. Application Startup Server starts │
Expand All @@ -143,8 +143,8 @@ Understanding the execution order is critical for writing correct tests. Here's
| `SetupAsync` | Per-test | Async operations before config (create DB tables) |
| `Factory.ConfigureWebHost` | Shared | Base configuration for all tests |
| `Factory.ConfigureStartupConfiguration` | Shared | Base startup configuration |
| `ConfigureTestConfiguration` | Per-test | Override factory configuration |
| `ConfigureWebHostBuilder` | Per-test | Low-level escape hatch |
| `ConfigureTestConfiguration` | Per-test | Override factory configuration |
| `ConfigureTestServices` | Per-test | Override factory services |

:::tip Tests Can Override Factory
Expand Down Expand Up @@ -790,7 +790,7 @@ The key benefits:

**Problem:** You set a value in `ConfigureTestConfiguration` but the factory's value is still used.

**Solution:** Make sure you're using the same configuration key. The test configuration runs **after** the factory configuration (step 5 vs steps 3-4), so it should override. Check that:
**Solution:** Make sure you're using the same configuration key. The test configuration runs **after** the factory configuration (step 6 vs steps 3-4), so it should override. Check that:

1. You're using `AddInMemoryCollection` which adds to the config sources
2. The configuration key path is exactly the same
Expand Down Expand Up @@ -927,14 +927,14 @@ public class LifecycleDebugTest : WebApplicationTest<WebApplicationFactory, Prog
await base.SetupAsync();
}

protected override void ConfigureTestConfiguration(IConfigurationBuilder config)
protected override void ConfigureWebHostBuilder(IWebHostBuilder builder)
{
Console.WriteLine("5. ConfigureTestConfiguration");
Console.WriteLine("5. ConfigureWebHostBuilder");
}

protected override void ConfigureWebHostBuilder(IWebHostBuilder builder)
protected override void ConfigureTestConfiguration(IConfigurationBuilder config)
{
Console.WriteLine("6. ConfigureWebHostBuilder");
Console.WriteLine("6. ConfigureTestConfiguration");
}

protected override void ConfigureTestServices(IServiceCollection services)
Expand Down
Loading