2016-06-21 2 views
9
다음 코드는 예상대로 작동하고 ASP 사이트에있는 샘플 정말 비슷합니다

작동하지 않습니다 컨트롤러는 괜찮아. 그러나 실생활에서 테스트는 좀 더 복잡하고 서비스 및 사용자 정의 테스트 구성을 추가해야합니다. 내 원래 프로젝트의 시작 클래스에서 상속 TestStartup를 만드는이 작업을 수행하기 위해.NET의 핵심 RC2가 아닌 사소한 통합 테스트는

: 당신은 그래서 지금은 내을 사용하는 빌더를 변경, 기본 클래스 만 위임을 볼 수 있듯이

public class TestStartup : Startup 
{ 
    public TestStartup(IHostingEnvironment env) : base(env) 
    { 
    } 

    public override void ConfigureServices(IServiceCollection services) 
    { 
     base.ConfigureServices(services); 
    } 

    public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     base.Configure(app, env, loggerFactory); 
    } 
} 

테스트 시작 코드 :

protected BaseResourceTests(string resourceVersion) 
    { 
     var hostBulider = new WebHostBuilder() 
      .UseStartup<TestStartup>(); 

     _server = new TestServer(hostBulider); 

     HttpClient = _server.CreateClient(); 
     HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(resourceVersion)); 
     HttpClient.BaseAddress = new Uri("http://localhost:5000"); 
    } 

그리고 이제는 HTTP NotFound 예외로 테스트가 실패합니다. 디버깅 할 때 컨트롤러의 동작이 테스트 코드에 더 이상 부딪치지 않는 것으로 나타났습니다.

내 생각 엔 시동 파일이 다른 어셈블리와 컨트롤러 인 경우 mvc가 경로를 감지하지 않는다는 것입니다. 어떻게이 문제를 해결할 수 있습니까?

+0

'_server = new TestServer (hostBulider);'로 변경하십시오. _server = TestServer.CreateBuilder(). UseStartup (); – Set

+0

TestServer 클래스에 정적 메서드 CreateBuilder가 없습니다. 원래 rc1에 있었던 것 같아요 – Calin

답변

1

xUnit과 같은 종류의 통합 테스트에 대한 게시물을 여기에 작성했습니다 : http://andrewlock.net/introduction-to-integration-testing-with-xunit-and-testserver-in-asp-net-core.


내가했다 접근 방식은 테스트 클래스에 주입 할 수있는 Fixture 클래스를 만드는 것이 었습니다.

고정 장치 :

public class TestFixture<TStartup> : IDisposable where TStartup : class 
{ 
    private readonly TestServer _server; 

    public TestFixture() 
    { 
     var builder = new WebHostBuilder().UseStartup<TStartup>(); 
     _server = new TestServer(builder); 

     Client = _server.CreateClient(); 
     Client.BaseAddress = new Uri("http://localhost:5000"); 
    } 

    public HttpClient Client { get; } 

    public void Dispose() 
    { 
     Client.Dispose(); 
     _server.Dispose(); 
    } 
} 

테스트 클래스는 다음 IClassFixture<TestFixture<TStartup>> 구현합니다

은 MVC를 사용하여 뷰를 발견 할 수 있도록하기 위해
public class MiddlewareIntegrationTests : IClassFixture<TestFixture<SystemUnderTest.Startup>> 
{ 
    public MiddlewareIntegrationTests(TestFixture<SystemUnderTest.Startup> fixture) 
    { 
     Client = fixture.Client; 
    } 

    public HttpClient Client { get; } 

    [Fact] 
    public async Task AllMethods_RemovesServerHeader(string method) 
    { 
     // Arrange 
     var request = new HttpRequestMessage(new HttpMethod("GET"), "/"); 

     // Act 
     var response = await Client.SendAsync(request); 

     //assert etc 
    } 
} 

, 당신은을 설정하여 WebHostBuilder를 업데이트해야 콘텐츠 경로 :

var path = PlatformServices.Default.Application.ApplicationBasePath; 
var setDir = Path.GetFullPath(Path.Combine(path, <projectpathdirectory>)); 

var builder = new WebHostBuilder() 
    .UseContentRoot(setDir) 
    .UseStartup<TStartup>(); 
+0

고맙습니다. 실제로 내 질문을 게시하기 전에 블로그 게시물을 읽었으며 테스트에서 동일한 동작을 보였습니다. 곧 이것을 증명하기위한 레포. – Calin

0

.net 핵심 버전 당신이 사용하고 있습니까? 미리보기 1?

RTM (preview2--31 ...) 에 대한 업데이트 이미 수정 된 버그가 있었을 수도 있습니다.

+0

.net core rc2 질문의 제목에 풀 버전이 릴리스되었습니다. 테스트를 해 볼 것입니다. – Calin

+0

죄송합니다. RC2는 미리보기 1입니다. D는 SDK입니다. –

0

그런 방식으로 서비스를 테스트하여 서비스를 재정의 할 수 없습니다. 내가 한 것은 종속성을 추가하고 메소드를 과도하게 만드는 메소드를 작성하는 것입니다. 그렇다면 내 테스트에서 나는 그 방법을 무시하고 다른 의존성을 주입 할 것이다.

내 블로그에이 설명 : 내가 일할 수있는 재정의 시작 클래스를 얻기 위해해야 ​​할 일을했을 http://www.stefanhendriks.com/2016/04/29/integration-testing-your-dot-net-core-app-with-an-in-memory-database/

1

하나 더 추가 변화는 웹의 실제 이름으로 IHostingEnvironment 객체의 ApplicationName을 설정하는 것입니다 계획.

public TestStartup(IHostingEnvironment env) : base(env) 
     { 
      env.ApplicationName = "Demo.Web"; 
     } 

이것은 TestStartup이 다른 어셈블리에 있고 원래 시작 클래스를 덮어 쓸 때 필요합니다. 내 경우에는 UseContentRoot가 필요했습니다.

이름을 설정하지 않으면 항상 404가 없습니다.

관련 문제