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