.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(@"..\..\..\..\..\") + @"src\My.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和仓储层是不一样的,一般我们使用第一种集成测试就好了。

 

posted @ 2019-08-20 22:21  Sealee  阅读(2004)  评论(3编辑  收藏  举报