refactor test base

This commit is contained in:
meysamhadeli 2022-12-11 21:34:19 +03:30
parent d68663ad37
commit 1c4f20ddbc
21 changed files with 77 additions and 55 deletions

View File

@ -32,7 +32,7 @@ using ILogger = Serilog.ILogger;
namespace BuildingBlocks.TestBase; namespace BuildingBlocks.TestBase;
public class TestFactory<TEntryPoint> : IAsyncLifetime public class TestFixture<TEntryPoint> : IAsyncLifetime
where TEntryPoint : class where TEntryPoint : class
{ {
private readonly WebApplicationFactory<TEntryPoint> _factory; private readonly WebApplicationFactory<TEntryPoint> _factory;
@ -51,7 +51,7 @@ public class TestFactory<TEntryPoint> : IAsyncLifetime
public IConfiguration Configuration => _factory?.Services.GetRequiredService<IConfiguration>(); public IConfiguration Configuration => _factory?.Services.GetRequiredService<IConfiguration>();
public ILogger Logger { get; set; } public ILogger Logger { get; set; }
public TestFactory() public TestFixture()
{ {
_factory = new WebApplicationFactory<TEntryPoint>() _factory = new WebApplicationFactory<TEntryPoint>()
.WithWebHostBuilder(builder => .WithWebHostBuilder(builder =>
@ -258,7 +258,7 @@ public class TestFactory<TEntryPoint> : IAsyncLifetime
} }
} }
public class TestFactory<TEntryPoint, TWContext> : TestFactory<TEntryPoint> public class TestWriteFixture<TEntryPoint, TWContext> : TestFixture<TEntryPoint>
where TEntryPoint : class where TEntryPoint : class
where TWContext : DbContext where TWContext : DbContext
{ {
@ -365,7 +365,23 @@ public class TestFactory<TEntryPoint, TWContext> : TestFactory<TEntryPoint>
} }
} }
public class TestFactory<TEntryPoint, TWContext, TRContext> : TestFactory<TEntryPoint, TWContext>
public class TestReadFixture<TEntryPoint, TRContext> : TestFixture<TEntryPoint>
where TEntryPoint : class
where TRContext : MongoDbContext
{
public Task ExecuteReadContextAsync(Func<TRContext, Task> action)
{
return ExecuteScopeAsync(sp => action(sp.GetRequiredService<TRContext>()));
}
public Task<T> ExecuteReadContextAsync<T>(Func<TRContext, Task<T>> action)
{
return ExecuteScopeAsync(sp => action(sp.GetRequiredService<TRContext>()));
}
}
public class TestFixture<TEntryPoint, TWContext, TRContext> : TestWriteFixture<TEntryPoint, TWContext>
where TEntryPoint : class where TEntryPoint : class
where TWContext : DbContext where TWContext : DbContext
where TRContext : MongoDbContext where TRContext : MongoDbContext
@ -389,14 +405,14 @@ public class TestFixtureCore<TEntryPoint> : IAsyncLifetime
private SqlConnection DefaultDbConnection { get; set; } private SqlConnection DefaultDbConnection { get; set; }
private SqlConnection PersistDbConnection { get; set; } private SqlConnection PersistDbConnection { get; set; }
public TestFixtureCore(TestFactory<TEntryPoint> integrationTestFixture, ITestOutputHelper outputHelper) public TestFixtureCore(TestFixture<TEntryPoint> integrationTestFixture, ITestOutputHelper outputHelper)
{ {
Fixture = integrationTestFixture; Fixture = integrationTestFixture;
integrationTestFixture.RegisterServices(services => RegisterTestsServices(services)); integrationTestFixture.RegisterServices(services => RegisterTestsServices(services));
integrationTestFixture.Logger = integrationTestFixture.CreateLogger(outputHelper); integrationTestFixture.Logger = integrationTestFixture.CreateLogger(outputHelper);
} }
public TestFactory<TEntryPoint> Fixture { get; } public TestFixture<TEntryPoint> Fixture { get; }
public async Task InitializeAsync() public async Task InitializeAsync()
@ -487,18 +503,33 @@ public class TestFixtureCore<TEntryPoint> : IAsyncLifetime
} }
} }
public abstract class TestBase<TEntryPoint, TWContext> : TestFixtureCore<TEntryPoint> public abstract class TestReadBase<TEntryPoint, TRContext> : TestFixtureCore<TEntryPoint>
//,IClassFixture<IntegrationTestFactory<TEntryPoint, TWContext>> //,IClassFixture<IntegrationTestFactory<TEntryPoint, TWContext>>
where TEntryPoint : class where TEntryPoint : class
where TWContext : DbContext where TRContext : MongoDbContext
{ {
protected TestBase( protected TestReadBase(
TestFactory<TEntryPoint, TWContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) TestReadFixture<TEntryPoint, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{ {
Fixture = integrationTestFixture; Fixture = integrationTestFixture;
} }
public TestFactory<TEntryPoint, TWContext> Fixture { get; } public TestReadFixture<TEntryPoint, TRContext> Fixture { get; }
}
public abstract class TestWriteBase<TEntryPoint, TWContext> : TestFixtureCore<TEntryPoint>
//,IClassFixture<IntegrationTestFactory<TEntryPoint, TWContext>>
where TEntryPoint : class
where TWContext : DbContext
{
protected TestWriteBase(
TestWriteFixture<TEntryPoint, TWContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{
Fixture = integrationTestFixture;
}
public TestWriteFixture<TEntryPoint, TWContext> Fixture { get; }
} }
public abstract class TestBase<TEntryPoint, TWContext, TRContext> : TestFixtureCore<TEntryPoint> public abstract class TestBase<TEntryPoint, TWContext, TRContext> : TestFixtureCore<TEntryPoint>
@ -508,10 +539,10 @@ public abstract class TestBase<TEntryPoint, TWContext, TRContext> : TestFixtureC
where TRContext : MongoDbContext where TRContext : MongoDbContext
{ {
protected TestBase( protected TestBase(
TestFactory<TEntryPoint, TWContext, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) TestFixture<TEntryPoint, TWContext, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{ {
Fixture = integrationTestFixture; Fixture = integrationTestFixture;
} }
public TestFactory<TEntryPoint, TWContext, TRContext> Fixture { get; } public TestFixture<TEntryPoint, TWContext, TRContext> Fixture { get; }
} }

View File

@ -23,7 +23,8 @@ namespace Integration.Test.Booking.Features;
public class CreateBookingTests : BookingIntegrationTestBase public class CreateBookingTests : BookingIntegrationTestBase
{ {
public CreateBookingTests(TestFactory<Program, AppDbContextBase, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture) public CreateBookingTests(TestReadFixture<Program, BookingReadDbContext> integrationTestFixture) : base(
integrationTestFixture)
{ {
} }
@ -41,21 +42,13 @@ public class CreateBookingTests : BookingIntegrationTestBase
var command = new FakeCreateBookingCommand().Generate(); var command = new FakeCreateBookingCommand().Generate();
// Act // Act
try
{
var response = await Fixture.SendAsync(command);
// Assert var response = await Fixture.SendAsync(command);
response.Should().BeGreaterOrEqualTo(0);
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true); // Assert
} response.Should().BeGreaterOrEqualTo(0);
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
} }

View File

@ -1,22 +1,20 @@
using Booking.Api; using Booking.Api;
using Booking.Data; using Booking.Data;
using BuildingBlocks.EFCore;
using BuildingBlocks.PersistMessageProcessor.Data;
using BuildingBlocks.TestBase; using BuildingBlocks.TestBase;
using Xunit; using Xunit;
namespace Integration.Test; namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)] [Collection(IntegrationTestCollection.Name)]
public class BookingIntegrationTestBase: TestBase<Program, AppDbContextBase, BookingReadDbContext> public class BookingIntegrationTestBase: TestReadBase<Program, BookingReadDbContext>
{ {
public BookingIntegrationTestBase(TestFactory<Program, AppDbContextBase, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture) public BookingIntegrationTestBase(TestReadFixture<Program, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{ {
} }
} }
[CollectionDefinition(Name)] [CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, AppDbContextBase, BookingReadDbContext>> public class IntegrationTestCollection : ICollectionFixture<TestReadFixture<Program, BookingReadDbContext>>
{ {
public const string Name = "Booking Integration Test"; public const string Name = "Booking Integration Test";
} }

View File

@ -12,7 +12,7 @@ namespace EndToEnd.Test.Flight.Features;
public class CreateFlightTests : FlightEndToEndTestBase public class CreateFlightTests : FlightEndToEndTestBase
{ {
public CreateFlightTests(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture) public CreateFlightTests(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{ {
} }

View File

@ -12,7 +12,7 @@ namespace EndToEnd.Test.Flight.Features;
public class GetFlightByIdTests: FlightEndToEndTestBase public class GetFlightByIdTests: FlightEndToEndTestBase
{ {
public GetFlightByIdTests(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture) public GetFlightByIdTests(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{ {
} }

View File

@ -8,13 +8,13 @@ namespace EndToEnd.Test;
[Collection(EndToEndTestCollection.Name)] [Collection(EndToEndTestCollection.Name)]
public class FlightEndToEndTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext> public class FlightEndToEndTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext>
{ {
public FlightEndToEndTestBase(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture) public FlightEndToEndTestBase(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{ {
} }
} }
[CollectionDefinition(Name)] [CollectionDefinition(Name)]
public class EndToEndTestCollection : ICollectionFixture<TestFactory<Program, FlightDbContext, FlightReadDbContext>> public class EndToEndTestCollection : ICollectionFixture<TestFixture<Program, FlightDbContext, FlightReadDbContext>>
{ {
public const string Name = "Flight EndToEnd Test"; public const string Name = "Flight EndToEnd Test";
} }

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Aircraft.Features;
public class CreateAircraftTests : FlightIntegrationTestBase public class CreateAircraftTests : FlightIntegrationTestBase
{ {
public CreateAircraftTests( public CreateAircraftTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Airport.Features;
public class CreateAirportTests : FlightIntegrationTestBase public class CreateAirportTests : FlightIntegrationTestBase
{ {
public CreateAirportTests( public CreateAirportTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features;
public class CreateFlightTests : FlightIntegrationTestBase public class CreateFlightTests : FlightIntegrationTestBase
{ {
public CreateFlightTests( public CreateFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -15,7 +15,7 @@ namespace Integration.Test.Flight.Features;
public class DeleteFlightTests : FlightIntegrationTestBase public class DeleteFlightTests : FlightIntegrationTestBase
{ {
public DeleteFlightTests( public DeleteFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features;
public class GetAvailableFlightsTests : FlightIntegrationTestBase public class GetAvailableFlightsTests : FlightIntegrationTestBase
{ {
public GetAvailableFlightsTests( public GetAvailableFlightsTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features;
public class GetFlightByIdTests : FlightIntegrationTestBase public class GetFlightByIdTests : FlightIntegrationTestBase
{ {
public GetFlightByIdTests( public GetFlightByIdTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features;
public class UpdateFlightTests : FlightIntegrationTestBase public class UpdateFlightTests : FlightIntegrationTestBase
{ {
public UpdateFlightTests( public UpdateFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -8,13 +8,13 @@ namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)] [Collection(IntegrationTestCollection.Name)]
public class FlightIntegrationTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext> public class FlightIntegrationTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext>
{ {
public FlightIntegrationTestBase(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture) public FlightIntegrationTestBase(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{ {
} }
} }
[CollectionDefinition(Name)] [CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, FlightDbContext, FlightReadDbContext>> public class IntegrationTestCollection : ICollectionFixture<TestFixture<Program, FlightDbContext, FlightReadDbContext>>
{ {
public const string Name = "Flight Integration Test"; public const string Name = "Flight Integration Test";
} }

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features;
public class GetAvailableSeatsTests : FlightIntegrationTestBase public class GetAvailableSeatsTests : FlightIntegrationTestBase
{ {
public GetAvailableSeatsTests( public GetAvailableSeatsTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features;
public class ReserveSeatTests : FlightIntegrationTestBase public class ReserveSeatTests : FlightIntegrationTestBase
{ {
public ReserveSeatTests( public ReserveSeatTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory) TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -12,7 +12,7 @@ namespace Integration.Test.Identity.Features;
public class RegisterNewUserTests : IdentityIntegrationTestBase public class RegisterNewUserTests : IdentityIntegrationTestBase
{ {
public RegisterNewUserTests( public RegisterNewUserTests(
TestFactory<Program, IdentityContext> integrationTestFactory) : base(integrationTestFactory) TestWriteFixture<Program, IdentityContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -6,16 +6,16 @@ using Xunit;
namespace Integration.Test; namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)] [Collection(IntegrationTestCollection.Name)]
public class IdentityIntegrationTestBase: TestBase<Program, IdentityContext> public class IdentityIntegrationTestBase: TestWriteBase<Program, IdentityContext>
{ {
public IdentityIntegrationTestBase(TestFactory<Program, IdentityContext> integrationTestFactory) public IdentityIntegrationTestBase(TestWriteFixture<Program, IdentityContext> integrationTestFactory)
: base(integrationTestFactory) : base(integrationTestFactory)
{ {
} }
} }
[CollectionDefinition(Name)] [CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, IdentityContext>> public class IntegrationTestCollection : ICollectionFixture<TestWriteFixture<Program, IdentityContext>>
{ {
public const string Name = "Identity Integration Test"; public const string Name = "Identity Integration Test";
} }

View File

@ -12,7 +12,7 @@ namespace Integration.Test.Passenger.Features;
public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
{ {
public CompleteRegisterPassengerTests( public CompleteRegisterPassengerTests(
TestFactory<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory) TestWriteFixture<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Passenger.Features;
public class GetPassengerByIdTests : PassengerIntegrationTestBase public class GetPassengerByIdTests : PassengerIntegrationTestBase
{ {
public GetPassengerByIdTests( public GetPassengerByIdTests(
TestFactory<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory) TestWriteFixture<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
{ {
} }

View File

@ -6,16 +6,16 @@ using Xunit;
namespace Integration.Test; namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)] [Collection(IntegrationTestCollection.Name)]
public class PassengerIntegrationTestBase: TestBase<Program, PassengerDbContext> public class PassengerIntegrationTestBase: TestWriteBase<Program, PassengerDbContext>
{ {
public PassengerIntegrationTestBase(TestFactory<Program, PassengerDbContext> integrationTestFactory) public PassengerIntegrationTestBase(TestWriteFixture<Program, PassengerDbContext> integrationTestFactory)
: base(integrationTestFactory) : base(integrationTestFactory)
{ {
} }
} }
[CollectionDefinition(Name)] [CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, PassengerDbContext>> public class IntegrationTestCollection : ICollectionFixture<TestWriteFixture<Program, PassengerDbContext>>
{ {
public const string Name = "Passenger Integration Test"; public const string Name = "Passenger Integration Test";
} }