【问题标题】:Unit testing that the swagger doc is correct without starting a server在不启动服务器的情况下对 swagger 文档进行单元测试是正确的
【发布时间】:2020-07-20 13:30:16
【问题描述】:

我想测试 swagger 文档对于我的应用程序是否正确(主要是因为我添加了一个策略来生成自定义 OperationId,并且我想确保它们正确唯一)

但是,我找到的唯一解决方案都是使用“真实”服务器(cf https://stackoverflow.com/a/52521454/1545567),这对我来说不是一个选项,因为我没有数据库、消息总线等......当我启动时CI 中的单元测试...

目前,我有以下内容,但它总是生成 0 个路径和 0 个模型...

using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using SampleCheckIn;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Linq;
using Xunit;
using SampleCheckIn.Def;
using Service.Utils;
using Swashbuckle.AspNetCore.Swagger;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.FileProviders;

namespace D4Interop.Tests
{
    public class TmpTest
    {
        [Fact]
        public void Tmp()
        {
            var controllers = typeof(Startup).Assembly.GetTypes().Where(x => IsController(x)).ToList();
            controllers.Any().Should().BeTrue();

            var services = new ServiceCollection();
            controllers.ForEach(c => services.AddScoped(c));
            
            services.AddLogging(logging => logging.AddConsole());
            services.AddControllers(); //here, I've also tried AddMvcCore and other ASP methods...
            services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("api", new OpenApiInfo { Title = Constants.SERVICE_NAME, Version = "_", Description = Constants.SERVICE_DESC });
                    //c.OperationFilter<SwaggerUniqueOperationId>(); //this is my filter that ensures the operationId is unique
                    c.CustomOperationIds(apiDesc =>
                    {
                        return apiDesc.TryGetMethodInfo(out var methodInfo) ? methodInfo.Name : null;
                    });
                });
            services.AddSingleton<IWebHostEnvironment>(new FakeWebHostEnvironment());
            var serviceProvider = services.BuildServiceProvider();


            var swaggerProvider = serviceProvider.GetRequiredService<ISwaggerProvider>();
            var swagger = swaggerProvider.GetSwagger("api");

            swagger.Should().NotBeNull();
            swagger.Paths.Any().Should().BeTrue();
        }

        private bool IsController(Type x)
        {
            return typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(x);
        }
    }

    internal class FakeWebHostEnvironment : IWebHostEnvironment
    {
        public FakeWebHostEnvironment()
        {
        }

        public IFileProvider WebRootFileProvider { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public string WebRootPath { get => "/root"; set => throw new NotImplementedException(); }
        public string EnvironmentName { get => "dev"; set => throw new NotImplementedException(); }
        public string ApplicationName { get => "app"; set => throw new NotImplementedException(); }
        public string ContentRootPath { get => "/"; set => throw new NotImplementedException(); }
        public IFileProvider ContentRootFileProvider { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    }
}

【问题讨论】:

    标签: swashbuckle.aspnetcore


    【解决方案1】:

    好的,我终于发现我只需要将链接的答案与我的代码混合:

    [Fact]
    public async Task TestSwagger()
    {
        var server = Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(options => { options.UseStartup<Startup>(); })
            .Build();
    
        var swagger = server.Services
            .GetRequiredService<ISwaggerProvider>()
            .GetSwagger("xxx"); //xxx should be the name of your API
    
        swagger.Should().NotBeNull();
        swagger.Paths.Any().Should().BeTrue();
        swagger.Components.Schemas.Should().NotBeNull();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2013-05-04
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多