.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和倉儲層是不一樣的,一般我們使用第一種集成測試就好了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM