이것은 처음으로 단위 테스트를 작성하는 것이므로 몇 가지 질문이 있습니다. 내 서비스를 테스트하기 위해 메모리 데이터베이스를 사용하고 있으며, 올바르게 작동하는지 궁금합니다. 내 첫 번째 질문은 내 서비스 요청에 대해 여러 번 주장해야한다는 것입니다. 내가 InsertProduct
에 대한 주장이 필요합니까? 둘째, 모든 서비스 호출에서 컨텍스트의 새로운 인스턴스를 사용하여이를 테스트하고 있습니까?다중 어설트가 필요합니까? xUnit 테스트
[Fact]
public void ProductService_DeleteProduct_Test()
{
// arrange
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(databaseName: "ProductService_DeleteProduct_Test")
.Options;
var product = new Product() { Id = Guid.NewGuid(), Name = "Product"};
// act
// insert
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
service.ProductService.InsertProduct(product);
}
// delete
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
service.ProductService.DeleteProducts(new List<Guid> { product.Id });
}
// assert
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
Assert.Equal(0, service.ProductService.GetAllProducts().Count);
}
}
질문을 받아들이 기 전에 필자는 엔티티 프레임 워크를 사용하여 내 테스트를 수정하기 때문에'context.Database.ExecuteSqlCommand' 또는'context.Database.SqlQuery'를 사용해야하거나'using System '을 사용해야 만합니다. Data.SqlClient; ' – kram005
가능합니다. 그러나 과거에 테스트 프로젝트에서 별도의 연결 문자열을 사용했던 테스트 스위트가 있었지만 원시 SQL을 실행하는 데 'SqlCommands'를 사용했습니다. 따라서 테스트와 생산 코드 간의 마지막 연결조차도 제거됩니다. 어쨌든, 이것은 단지 세부 사항이며 당신은 기존의'DbContext'로 작업 할 것입니다. –
메모리 데이터베이스에서 ef를 사용하고 있기 때문에 dbcontext를 계속 사용해야하고 sqlcommand를 사용하여 메모리 데이터베이스에서 수행하는 방법을 모릅니다. – kram005