文档章节

.net core + xunit 集成测试

o
 osc_g8254g7s
发布于 2019/08/20 22:21
字数 528
阅读 5
收藏 0

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和仓储层是不一样的,一般我们使用第一种集成测试就好了。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

李开复谈2020年AI科学家创业。道翰天琼认知智能api机器人接口。

2012年至今,在深度学习推动下,这一波人工智能的蓬勃发展已进入第十个年头。 在初期,一系列由AI科学家创建的初创公司,经过大浪淘沙,如今已有多家脱颖而出成为独角兽企业;榜样在先,于是...

jackli2020
10分钟前
9
0
什么是PHP中的线程安全或非线程安全? - What is thread safe or non-thread safe in PHP?

问题: I saw different binaries for PHP, like non-thread or thread safe? 我看到了PHP的不同二进制文件,例如非线程还是线程安全的? What does this mean? 这是什么意思? What is the ...

fyin1314
23分钟前
26
0
移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!

随着95后、00后为主的年轻一代逐渐成为中国移动社交下的主力军,社交需求也发生了一些变化。这些年轻用户更倾向于有趣好玩,形式多样化的社交方式。同时也产生了如“扩列”、“养火花”等众多...

真正稳定的网易云信
30分钟前
22
0
如何在Java代码中去掉烦人的“!=null”

问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc();} 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥...

码农突围
31分钟前
21
0
ELK使用容器集成安装

ELK使用容器集成安装 1. 查看集成ELK:sebp docker search sebp 2. 设置内核参数 sysctl -w vm.max_map_count=262144 3. 拉取sebp/elk docker pull sebp/elk 4. 运行ELK yum install -y java......

huanke
41分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部