Wrote tests for most services, applied EF core optimisations
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
using LiteCharms.Features.MidrandBooks.Authors;
|
||||
using LiteCharms.Features.MidrandBooks.Authors.Models;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
using LiteCharms.Features.Models;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class AuthorServiceFeatureTests(Fixture fixture, ITestOutputHelper output) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly AuthorService authorService = fixture.Services.GetRequiredService<AuthorService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateAuthorAsync_ShouldReturn_ResultWithAuthorId()
|
||||
{
|
||||
var request = new CreateAuthor
|
||||
{
|
||||
Name = "John",
|
||||
LastName = "Doe",
|
||||
Company = "Solo Publishers",
|
||||
Email = "solo@publishers.co.za",
|
||||
PublisherType = PublisherTypes.Independent,
|
||||
ImageUrl = ""
|
||||
};
|
||||
|
||||
var result = await authorService.CreateAuthorAsync(request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateAuthorAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var request = new UpdateAuthor
|
||||
{
|
||||
Name = "Jane",
|
||||
LastName = "Doe",
|
||||
Company = "Solo Publishers",
|
||||
Email = "solo@publishers.co.za",
|
||||
PublisherType = PublisherTypes.Independent,
|
||||
ImageUrl = ""
|
||||
};
|
||||
|
||||
var result = await authorService.UpdateAuthorAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetAuthors_ShouldReturn_ResultWithAuthorList()
|
||||
{
|
||||
var range = new DateRange
|
||||
{
|
||||
From = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)),
|
||||
To = DateOnly.FromDateTime(DateTime.UtcNow),
|
||||
MaxRecords = 1000
|
||||
};
|
||||
|
||||
var result = await authorService.GetAuthorsAsync(range, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetAuthorAsync_ShouldReturn_ResultWithAuthor()
|
||||
{
|
||||
var result = await authorService.GetAuthorAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateAuthorStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await authorService.UpdateAuthorStatusAsync(1, true, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using LiteCharms.Features.MidrandBooks.AuthorBooks;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class BooksServiceFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly BooksService bookService = fixture.Services.GetRequiredService<BooksService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateBookAsync_ShouldReturn_ResultWithBookId()
|
||||
{
|
||||
var result = await bookService.CreateBookAsync(1, 2, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetBookAsync_ShouldReturn_ResultWithBook()
|
||||
{
|
||||
var result = await bookService.GetBookAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetBooksByAuthorAsync_ShouldReturn_ResultWithAuthorBooks()
|
||||
{
|
||||
var result = await bookService.GetBooksByAuthorAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetPublishedBooksAsync_ShouldReturn_ResultWithBublishedBooks()
|
||||
{
|
||||
var result = await bookService.GetPublishedBooksAsync(0, 1000, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateBookStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await bookService.UpdateBookStatusAsync(1, true, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
using LiteCharms.Features.MidrandBooks.Abstractions;
|
||||
using LiteCharms.Features.MidrandBooks.Extensions;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
|
||||
public class Fixture : IDisposable
|
||||
{
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
|
||||
public class IntegrationFactAttribute : FactAttribute
|
||||
{
|
||||
@@ -0,0 +1,201 @@
|
||||
using LiteCharms.Features.MidrandBooks.Customers;
|
||||
using LiteCharms.Features.MidrandBooks.Customers.Models;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class CustomerServiceFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly CustomerService customerService = fixture.Services.GetRequiredService<CustomerService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateCustomerAsync_ShouldReturn_ResultWithCustomerId()
|
||||
{
|
||||
var request = new CreateCustomer
|
||||
{
|
||||
Company = "Book Lovers",
|
||||
Email = "hank@booklovers.com",
|
||||
Phone = "555 1245 8577",
|
||||
Website = "https://www.booklovers.com"
|
||||
};
|
||||
|
||||
var result = await customerService.CreateCustomerAsync(request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateCustomerContactAsync_ShouldReturn_ResultWithCustomerContactId()
|
||||
{
|
||||
var request = new CreateCustomerContact
|
||||
{
|
||||
Name = "Sipho",
|
||||
LastName = "Madlanga",
|
||||
Phone = "0710857365",
|
||||
Email = "sipho@madlanga.africa",
|
||||
Type = ContactTypes.Business
|
||||
};
|
||||
|
||||
var result = await customerService.CreateCustomerContactAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateCustomerAddressAsync_ShouldReturn_ResultWithCustomerAddressId()
|
||||
{
|
||||
var request = new CreateCustomerAddress
|
||||
{
|
||||
Name = "Business",
|
||||
BuildingType = AddressBuildingTypes.MixedUse,
|
||||
Type = AddressType.Shipping,
|
||||
Street = "123 Building 4, XYZ Suburb, Some Region",
|
||||
City = "Johannesburg",
|
||||
State = "Gauteng",
|
||||
Country = "South Africa",
|
||||
IsPrimary = true,
|
||||
Enabled = true,
|
||||
PostalCode = "12345"
|
||||
};
|
||||
|
||||
var result = await customerService.CreateCustomerAddressAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var request = new UpdateCustomer
|
||||
{
|
||||
Company = "Book Lovers",
|
||||
Email = "hank@booklovers.com",
|
||||
Phone = "555 1245 8578",
|
||||
Website = "https://www.booklovers.com"
|
||||
};
|
||||
|
||||
var result = await customerService.UpdateCustomerAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerContactAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var request = new UpdateCustomerContact
|
||||
{
|
||||
Name = "Sipho",
|
||||
LastName = "Madlanga",
|
||||
Phone = "0710857366",
|
||||
Email = "sipho@madlanga.africa",
|
||||
Type = ContactTypes.Business
|
||||
};
|
||||
|
||||
var result = await customerService.UpdateCustomerContactAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerAddressAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var request = new UpdateCustomerAddress
|
||||
{
|
||||
Name = "Business",
|
||||
BuildingType = AddressBuildingTypes.MixedUse,
|
||||
Type = AddressType.Shipping,
|
||||
Street = "123 Building 4, XYZ Suburb, Some Region",
|
||||
City = "Johannesburg",
|
||||
State = "Gauteng",
|
||||
Country = "South Africa",
|
||||
IsPrimary = true,
|
||||
Enabled = true,
|
||||
PostalCode = "12346"
|
||||
};
|
||||
|
||||
var result = await customerService.UpdateCustomerAddressAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await customerService.UpdateCustomerStatusAsync(1, true, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerContactStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await customerService.UpdateCustomerContactStatusAsync(1, true, true, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateCustomerAddressStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await customerService.UpdateCustomerAddressStatusAsync(1, true, true, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomersAsync_ShouldReturn_ResultWithCustomerList()
|
||||
{
|
||||
var result = await customerService.GetCustomersAsync(fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomerContactsAsync_ShouldReturn_ResultWithCustomerContactList()
|
||||
{
|
||||
var result = await customerService.GetCustomerContactsAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomerAddressesAsync_ShouldReturn_ResultWithCustomerAddressList()
|
||||
{
|
||||
var result = await customerService.GetCustomerAddressesAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomerAsync_ShouldReturn_ResultWithCustomer()
|
||||
{
|
||||
var result = await customerService.GetCustomerAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomerContactAsync_ShouldReturn_ResultWithCustomerContact()
|
||||
{
|
||||
var result = await customerService.GetCustomerContactsAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetCustomerAddressAsync_ShouldReturn_ResultWithCustomerAddress()
|
||||
{
|
||||
var result = await customerService.GetCustomerAddressAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
using LiteCharms.Features.MidrandBooks.Orders;
|
||||
using LiteCharms.Features.MidrandBooks.Orders.Models;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
using LiteCharms.Features.Models;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class OrderServiceFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly OrderService orderService = fixture.Services.GetRequiredService<OrderService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateOrderAsync_ShouldReturn_ResultWithOrderId()
|
||||
{
|
||||
var request = new CreateOrder(250, "At the intercomm, dial 1 then option 2");
|
||||
|
||||
var result = await orderService.CreateOrderAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task AddItemToOrderAsync_ShouldReturn_ResultWithOrderItemId()
|
||||
{
|
||||
var request = new CreateOrderItem(1, 1, 2);
|
||||
|
||||
var result = await orderService.AddItemToOrderAsync(1, request, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value > 0);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task AddItemsToOrderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var requests = new List<CreateOrderItem>
|
||||
{
|
||||
new(1, 1, 1),
|
||||
new(1, 1, 3)
|
||||
};
|
||||
|
||||
var result = await orderService.AddItemsToOrderAsync(1, [.. requests], fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task RemoveItemFromOrderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await orderService.RemoveItemFromOrderAsync(1, 5, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task ClearOrderItemsAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await orderService.ClearOrderItemsAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CancelOrderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await orderService.CancelOrderAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetOrderAsync_ShouldReturn_ResultWithOrder()
|
||||
{
|
||||
var result = await orderService.GetOrderAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetOrdersByCustomerAsync_ShouldReturn_ResultWithOrderList()
|
||||
{
|
||||
var result = await orderService.GetOrdersByCustomerAsync(1, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetOrdersAsync_ShouldReturn_ResultWithOrderList()
|
||||
{
|
||||
var range = new DateRange
|
||||
{
|
||||
From = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)),
|
||||
To = DateOnly.FromDateTime(DateTime.UtcNow),
|
||||
MaxRecords = 1000
|
||||
};
|
||||
|
||||
var result = await orderService.GetOrdersAsync(range, 0, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotEmpty(result.Value);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateOrderStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
var result = await orderService.UpdateOrderStatusAsync(1, OrderStatus.Pending, fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task AddShippingToOrderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateShippingStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetShippingByOrderIdAsync_ShouldReturn_ResultWithShipping()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task RemoveShippingFromOrderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateShippingTrackingNumberAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreateShippingProviderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetShippingProvidersAsync_ShouldReturn_ResultWithShippingProviderList()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetShippingProviderAsync_ShouldReturn_ResultWithShippingProvider()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdateShippingProviderAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
using LiteCharms.Features.MidrandBooks.Pages;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class PageServiceFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly PageService pageService = fixture.Services.GetRequiredService<PageService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task CreatePageAsync_ShouldReturn_ResultWithPageId()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetPagesAsync_ByBookId_ShouldReturn_ResultWithPageList()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetPageAsync_ShouldReturn_ResultWithPage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task GetPageByNumberAsync_ById_And_BookPageNumber_ShouldReturn_ResultWithPage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdatePageAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task DeletePageAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task DeleteByPageTypeAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task DeleteAllAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task UpdatePageStatusAsync_ShouldReturn_ResultWithSuccess()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,10 +1,11 @@
|
||||
using LiteCharms.Features.MidrandBooks.Products;
|
||||
using LiteCharms.Features.MidrandBooks.Products.Models;
|
||||
using LiteCharms.Features.MidrandBooks.Tests.Common;
|
||||
using LiteCharms.Features.Models;
|
||||
|
||||
namespace LiteCharms.Features.MidrandBooks.Tests;
|
||||
|
||||
public class ProductServiceFeatureTest(Fixture fixture, ITestOutputHelper output) : IClassFixture<Fixture>
|
||||
public class ProductServiceFeatureTests(Fixture fixture, ITestOutputHelper output) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly ProductService productService = fixture.Services.GetRequiredService<ProductService>();
|
||||
|
||||
Reference in New Issue
Block a user