Microsoft Test Host를 사용하여 ASP.NET Core MVC 앱 테스트

자동화된 테스트는 매우 중요합니다. 일부 변경 후에도 코드가 계속 작동하도록 할 뿐만 아니라 코드 작성 프로세스(TDD)를 더 쉽게 만듭니다.

ASP.NET Core MVC 애플리케이션을 테스트하는 몇 가지 접근 방식이 있습니다. 가장 간단한 방법은 컨트롤러의 인스턴스를 만들고 테스트에서 해당 메서드를 호출하는 것입니다.

public class SomeControllerTests
{
    [Test]
    public async Task GetAll_ShouldReturnAll()
    {
        // Arrange
        var service = new SomeService();
        var controller = new SomeController(service);

        // Act
        var result = controller.GetAll();

        // Assert
        // TODO check result
    }
}


그러나 이 접근 방식에는 몇 가지 문제가 있습니다.
  • 모든 종속성이 있는 컨트롤러를 생성해야 합니다.
  • HTTP 부분(라우팅, 상태 코드, 직렬화)을 테스트하지 않음

  • 이러한 문제는 Microsoft.AspNetCore.TestHost nuget을 사용하여 해결할 수 있습니다.

    public class TestFixture
    {
        public HttpClient HttpClient { get; private set; }
    
        public async Task Initialize()
        {
            var builder = new HostBuilder()
                .ConfigureWebHost(webHost =>
                {
                    webHost.UseTestServer();
                    webHost.UseStartup<Startup>();
                    ConfigureWebHost(webHost);
                });
    
            _host = await builder.StartAsync();
            HttpClient = _host.GetTestClient();
        }
    
        private void ConfigureWebHost(IWebHostBuilder builder)
        {
            IConfigurationRoot configurationRoot = null;
            builder.ConfigureAppConfiguration((context, conf) =>
            {
                conf.AddJsonFile("appsettings.json");
                configurationRoot = conf.Build();
            });
    
            builder.ConfigureTestServices(services =>
            {
                // Here you can overwrite some services
            });
        }
    }
    


    요청 모델을 직렬화하는 데 도움이 되는 작은 클래스도 필요합니다.

    public class JsonContent : ByteArrayContent
    {
        public JsonContent(object obj) : base(ConvertToBytes(obj))
        {
            Headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    
        private static byte[] ConvertToBytes(object obj)
        {
            var serialized = JsonConvert.SerializeObject(obj);
            return Encoding.UTF8.GetBytes(serialized);
        }
    }
    


    이제 테스트에서 가짜 http 호스트를 만들 수 있습니다.

    public class SomeControllersTests
    {
        private TestFixture _sut;
    
        [SetUp]
        public async Task Setup()
        {
            _sut = new TestFixture();
            await _sut.Initialize();
        }
    
        [Test]
        public async Task GetAll_ShouldReturnAll()
        {
            // Act
            var request = new SomeRequest
            {
                // Some request data
            }
    
            var response = await _sut.HttpClient.PostAsync($"some-route", new JsonContent(request));
    
            // Assert
            // TODO check response
        }
    }
    


    또한 HttpClient로 조작하여 필요한 권한 부여를 추가할 수 있습니다.

    GLHF

    연결


  • https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0
  • 좋은 웹페이지 즐겨찾기