• .net core + xunit 集成测试


    xunit地址:https://github.com/xunit/xunit 

    一、利用请求来测试接口,主要是测试webapi控制器方法

    ①添加xunit项目 ,然后引用我们的主项目,nuget:

    Microsoft.AspNetCore.TestHost,

    Microsoft.AspNetCore.Mvc.Testing(不然找不到接口地址),

    Microsoft.NETCore.App,

    Microsoft.AspNetCore.App ,

    Microsoft.EntityFrameworkCore.InMemory   使用内存数据库进行测试

    ②在主项目中写几个测试接口

     ③测试项目中创建   TestServerFixture 

      public class TestServerFixture : IDisposable
        {
            private readonly TestServer _testServer;
            public HttpClient Client { get; }
    
            public TestServerFixture()
            {
                var bulild = new WebHostBuilder().UseStartup<Startup1>();
                _testServer = new TestServer(bulild);
                Client = _testServer.CreateClient();
            }
            public void Dispose()
            {
                Client.Dispose();
                _testServer.Dispose();
            }
        }

    然后创建 Startup1类跟主项目中保持一致。连接数据库的方式换成内存数据库,注:如果 有使用到IConfiguration,把路径写死成主项目的路径,然后得到IConfiguration

    根据路径获取IConfiguration的方法:

    //path 设置到住项目的路径即可
     IConfigurationBuilder builder = new ConfigurationBuilder()
                    .SetBasePath(path)   ////Microsoft.Extensions.Configuration.FileExtensions
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);//Microsoft.Extensions.Configuration.Json   AddJsonFile
    
                if (!string.IsNullOrWhiteSpace(environmentName))
                {
                    builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true);
                }
    
                builder = builder.AddEnvironmentVariables();  //Microsoft.Extensions.Configuration.EnvironmentVariables
    
                return builder.Build();

    创建测试,运行就可以了:

     授权的怎么调用:列如:接口使用的JWT授权

    在两个启动文件中加入,两个都需要加

     

     然后在测试的TestServerFixture 中添加头部信息

    如果通过了授权:

     二、测试仓储层代码,不走webapi,主要使用注入和解耦来实现依赖注入 ,需要引用:Autofac

    创建DbFixture.cs来实现注入和数据库使用

      public class DbFixture
        {
            public IContainer Container { get; private set; }
    
            public DbFixture()
            {
                var builder = new ContainerBuilder();
                //内存数据库
                var option = new DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase("My.D3").Options;
                MyDbContext context = new MyDbContext(option);
    
                //InitializeDbForTests  初始化测试数据
                new TestDataBuilder(context).Build();
    
    
                builder.RegisterInstance(context).As<MyDbContext>();
                //注入
                Server.ContentRootPath = Path.GetFullPath(@"..........") + @"srcMy.D3";
                IConfigurationRoot configuration = AppConfigurationHelper.Get(Server.ContentRootPath);
                builder.RegisterType<SimpleDbContextProvider<MyDbContext>>().As<IDbContextProvider<MyDbContext>>().InstancePerLifetimeScope();
                var assemblysServices = Assembly.Load("My.D3.Application");
                builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces();
                builder.RegisterAssemblyTypes(typeof(DbFixture).GetTypeInfo().Assembly);
    
                Container = builder.Build();
            }
        }

    测试仓储层案列:

     /// <summary>
        /// 集成测试 测试appservice层接口
        /// </summary>
        public class Test2_Test : IClassFixture<DbFixture>
        {
    
            private readonly IEnumAppService _enumAppService;
    
            public Test2_Test(DbFixture fixture)
            {
                this._enumAppService = fixture.Container.Resolve<IEnumAppService>();
            }
    
            /// <summary>
            /// 测试
            /// </summary>
            /// <param name="inDto"></param>
            /// <returns></returns>
            [Fact]
            public async Task Test()
            {
                EnumInDto inDto = new EnumInDto()
                {
                    EnumTypeName = "SexTypeEnum",
                    Module = "Demo"
                };
                var list = await _enumAppService.GetEnumArray(inDto);
                string aa = "222";
            }
    
        }

    这样就可以了,测试webapi和仓储层是不一样的,一般我们使用第一种集成测试就好了。

  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/11380126.html
Copyright © 2020-2023  润新知