4

asp.net 코어를 처음 사용합니다. 현재 Google, Facebook 및 Microsoft의 인증 공급자를 사용하는 소규모 사이트를 개발 중입니다.인증 공급자가있는 asp.net 코어 통합 통합

이제 HomeController에 대한 통합 테스트를 작성하고 싶습니다.

유형의 예외를 '시스템 :

builder.AddUserSecrets(); 

InvalidOperationException이가 슬로우됩니다에 내 Startup.cs에서 지금

public class HomeControllerTests : IDisposable 
{ 
    private HomeController _homeController; 
    private readonly TestServer _server; 
    private readonly HttpClient _client; 

    public HomeControllerTests() 
    { 
     _server = new TestServer(new WebHostBuilder().UseEnvironment("Development").UseStartup<Startup>()); 
     _client = _server.CreateClient(); 
    } 

    [Fact] 
    public async void Test() 
    { 
     var result = await _client.GetAsync("/"); 

     Assert.NotNull(result); 
    } 

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

: 내 테스트 클래스처럼 보이는 방법

이입니다. InvalidOperationException '이 Microsoft.Extensions.Configuration.UserSecrets.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까? 테스트는 빌드 서버에서도 실행됩니까?

답변

1

파일 내 문제를 보라. @Gevorg Narimanyan에게 올바른 방향으로 나를 밀어 주신 덕택입니다. StackOverflow에 나를 도왔던 here이라는 게시물을 발견했습니다.

은 여기 내 Programs.cs

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = GetHostBuilder(args) 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .Build(); 

     host.Run(); 
    } 

    public static IWebHostBuilder GetHostBuilder(string[] args) 
    { 
     var config = new ConfigurationBuilder() 
      .AddCommandLine(args) 
      .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
      .Build(); 

     return new WebHostBuilder() 
      .UseConfiguration(config) 
      .UseKestrel() 
      .UseStartup<Startup>(); 
    } 
} 

입니다 그리고 이것은 설치가 내 테스트 클래스에서 같은 모습입니다 : 당신이 아무 문제없이 프로젝트를 테스트 할 수 있습니다이 설정으로

public HomeControllerTests() 
    { 
     var basePath = PlatformServices.Default.Application.ApplicationBasePath; 
     var projectPath = Path.GetFullPath(Path.Combine(basePath, "../../../../WebProjectNameYouWantToTest")); 

     _server = new TestServer(Program.GetHostBuilder(new string[] {}).UseContentRoot(projectPath).UseEnvironment("Development").UseStartup<Startup>()); 
     _client = _server.CreateClient(); 
    } 

.

문제가 있거나 잘못된 것이라고 생각되면 주저하지 말고 저를 바로 잡으십시오.

+0

Authorize 속성은 어떻게 처리합니까? – Brian

1

builder.AddUserSecrets()userSecretsId을 테스트 프로젝트에서 액세스 할 수없는 project.json 파일에서 읽습니다. 테스트 가능한 구성 만 구현하는 다른 TestStartup 클래스로 테스트 서버를 실행할 수 있습니다.

_server = new TestServer(new WebHostBuilder() 
    .UseEnvironment("Development") 
    .UseStartup<TestStartup>()); 

class TestStartup 
{ 
    public TestStartup (IHostingEnvironment env) 
    { 
     ... 
    } 
} 

실제 프로젝트를 모든 관련 구성으로 테스트해야하는 경우 다음을 수행하십시오. 당신이 변경 program.cs을 테스트하려고하는 프로젝트

_server = new TestServer(Program.GetHostBuilder() 
    .UseContentRoot(@"YourFullPathToProjectWhichyoutest")); 
_client = _server.CreateClient(); 

는 여기에 내가 마지막으로 시간을 보냈

public static void Main(string[] args) 
{ 
    var host = GetHostBuilder() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .Build(); 

    host.Run(); 
} 
//move your common configurations here 
public static IWebHostBuilder GetHostBuilder() 
{ 
    return new WebHostBuilder() 
     .UseKestrel() 
     .UseStartup<Startup>(); 
} 
+0

전체 Startup 클래스를이 새로운 TestStartup으로 복사해야합니까? 아니면 완전한 예가 있습니까? 나를 위해 그것은 당신의 환경에 대한 실제 시험처럼 보이지 않습니다. –

+0

내 질문에 대한 업데이트가 있으십니까? –

+0

@ ĐorđePetrović 내 답변을 편집하는 데 너무 오래 걸리므로 시험해 볼 수 있습니다. –