2016-10-12 63 views
1

我在进行asp.net核心的集成测试时遇到了令人讨厌的错误。在asp.net核心进行集成测试时未能找到404

响应状态码不表示成功:404(未找到)。

以下是我的代码。

RegistrationControllerTests.cs

public class RegistrationControllerTests : IClassFixture<TestFixture<TestStartup>> 
    { 
     private readonly HttpClient _client; 

     public RegistrationControllerTests(TestFixture<TestStartup> fixture) 
     { 
      _client = fixture.Client; 
     } 

     [Fact] 
     public async void InitialiseTest() 
     { 
      //Arrange 
      var testSession = TestStartup.GetDefaultRegistrationModel(); 

      //Act 
      var response = await _client.GetAsync("/"); 
      //Assert 
      response.EnsureSuccessStatusCode(); 
      var responseString = await response.Content.ReadAsStringAsync(); 
      Assert.True(responseString.Contains(testSession.FormId)); 
     } 
    } 

TestStartup.cs

public class TestStartup 
    { 
     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvc(); 
      services.AddSingleton(provider => Configuration); 
      services.AddTransient<IRegistrationRepository, ServiceUtilities>(); 
      services.AddTransient<IClientServiceConnector, ClientServiceValidation>(); 
      services.AddTransient<IEmailSender, EmailSender>(); 
     } 

     private IConfiguration Configuration { get; set; } 
     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
     public void Configure(IApplicationBuilder app, IHostingEnvironment enviroment) 
     { 
      app.UseStaticFiles(); 
      app.UseFileServer(); 
      ConfigureRestAuthenticationSetting(enviroment); 
      app.UseMvc(ConfigureRoutes); 

      //app.Run(async (context) => 
      //{ 
      // await context.Response.WriteAsync("Hello World!"); 
      //}); 
     } 

     private void ConfigureRestAuthenticationSetting(IHostingEnvironment enviroment) 
     { 
      var config = new ConfigurationBuilder() 
       .SetBasePath(Path.Combine(enviroment.ContentRootPath,"wwwroot")) 
       .AddJsonFile("TestConfig.json"); 
      Configuration = config.Build(); 
     } 

     private void ConfigureRoutes(Microsoft.AspNetCore.Routing.IRouteBuilder routeBuilder) 
     { 
      routeBuilder.MapRoute("Default", "{controller=Registration}/{action=Index}/{formId}"); 
     } 

     public static RegistrationModel GetDefaultRegistrationModel() 
     { 
      return new RegistrationModel 
      { 
       FormId = "12345" 
      }; 
     } 
    } 

TestFixture.cs

public class TestFixture<TStartup> : IDisposable 
    { 
     private const string SolutionName = "RegistrationApplication.sln"; 
     private readonly TestServer _server; 
     public HttpClient Client { get; } 

     public TestFixture() 
      :this(Path.Combine("src")) 
     { 

     } 
     protected TestFixture(string solutionRelativeTargetProjectParentDir) 
     { 
      var startupAssembly = typeof(TStartup).GetTypeInfo().Assembly; 
      var contentRoot = GetProjectPath(solutionRelativeTargetProjectParentDir, startupAssembly); 

      var builder = new WebHostBuilder() 
       .UseContentRoot(contentRoot) 
       .ConfigureServices(InitializeServices) 
       .UseEnvironment("Development") 
       .UseStartup(typeof(TStartup)); 


      _server = new TestServer(builder); 

      Client = _server.CreateClient(); 
      Client.BaseAddress = new Uri("https://localhost:44316/Registration"); 
     } 

     protected virtual void InitializeServices(IServiceCollection services) 
     { 
      var startupAssembly = typeof(TStartup).GetTypeInfo().Assembly; 
      var manager = new ApplicationPartManager(); 
      manager.ApplicationParts.Add(new AssemblyPart(startupAssembly)); 

      manager.FeatureProviders.Add(new ControllerFeatureProvider()); 
      manager.FeatureProviders.Add(new ViewComponentFeatureProvider()); 
      services.AddSingleton(manager); 

     } 
     private static string GetProjectPath(string solutionRelativePath, Assembly startupAssembly) 
     { 
      var projectName = "RegistrationApplication"; 
      var applicationBasePath = PlatformServices.Default.Application.ApplicationBasePath; 
      var directoryInfo = new DirectoryInfo(applicationBasePath); 
      do 
      { 
       var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, SolutionName)); 
       if (solutionFileInfo.Exists) 
       { 
        return Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath, projectName)); 
       } 
       directoryInfo = directoryInfo.Parent; 
      } 
      while (directoryInfo.Parent != null); 
      throw new NotImplementedException($"Solution root could not be located using application root {applicationBasePath}."); 
     } 

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

回答

0

问题是你必须在GIT中提交TestConfig.json。这就是为什么它会抛出404错误,因为它找不到它。在提交TestConfig.json文件后,所有东西都像魅力一样。

以下是TestConfig.json正在使用的代码。

private void ConfigureRestAuthenticationSetting(IHostingEnvironment enviroment) 
     { 
      var config = new ConfigurationBuilder() 
       .SetBasePath(Path.Combine(enviroment.ContentRootPath,"wwwroot")) 
       .AddJsonFile("TestConfig.json"); 
      Configuration = config.Build(); 
     } 
相关问题