在asp.net核心中进行集成测试时找不到404

时间:2016-10-12 01:26:37

标签: c# asp.net integration-testing asp.net-core-mvc

我在asp.net核心进行集成测试时遇到了一个恼人的错误。

响应状态代码不表示成功: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();
        }
    }

1 个答案:

答案 0 :(得分: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();
        }