当前位置: 首页 > news >正文

网络工程师和网站开发员浙江省建设局房管科网站

网络工程师和网站开发员,浙江省建设局房管科网站,深圳软件开发公司在哪里,百度免费网站申请注册XUnit 依赖注入Intro现在的开发中越来越看重依赖注入的思想#xff0c;微软的 Asp.Net Core 框架更是天然集成了依赖注入#xff0c;那么在单元测试中如何使用依赖注入呢#xff1f;本文主要介绍如何通过 XUnit 来实现依赖注入#xff0c; XUnit 主要借助 SharedContext 来… XUnit 依赖注入Intro现在的开发中越来越看重依赖注入的思想微软的 Asp.Net Core 框架更是天然集成了依赖注入那么在单元测试中如何使用依赖注入呢本文主要介绍如何通过 XUnit 来实现依赖注入 XUnit 主要借助 SharedContext 来共享一部分资源包括这些资源的创建以及释放。Scoped针对 Scoped 的对象可以借助 XUnit 中的 IClassFixture 来实现定义自己的 Fixture需要初始化的资源在构造方法里初始化如果需要在测试结束的时候释放资源需要实现 IDisposable 接口需要依赖注入的测试类实现接口 IClassFixtureFixture在构造方法中注入实现的 Fixture 对象并在构造方法中使用 Fixture 对象中暴露的公共成员Singleton针对 Singleton 的对象可以借助 XUnit 中的 ICollectionFixture 来实现定义自己的 Fixture需要初始化的资源在构造方法里初始化如果需要在测试结束的时候释放资源需要实现 IDisposable 接口创建 CollectionDefinition实现接口 ICollectionFixtureFixture并添加一个 [CollectionDefinition(CollectionName)] Attribute CollectionName 需要在整个测试中唯一不能出现重复的 CollectionName在需要注入的测试类中添加 [Collection(CollectionName)] Attribute然后在构造方法中注入对应的 FixtureTips如果有多个类需要依赖注入可以通过一个基类来做这样就只需要一个基类上添加 [Collection(CollectionName)] Attribute其他类只需要集成这个基类就可以了SamplesScoped Sample这里直接以 XUnit 的示例为例public class DatabaseFixture : IDisposable { public DatabaseFixture() { Db new SqlConnection(MyConnectionString); // ... initialize data in the test database ... } public void Dispose() { // ... clean up test data from the database ... } public SqlConnection Db { get; private set; } } public class MyDatabaseTests : IClassFixtureDatabaseFixture { DatabaseFixture fixture; public MyDatabaseTests(DatabaseFixture fixture) { this.fixture fixture; } [Fact] public async Task GetTest() { // ... write tests, using fixture.Db to get access to the SQL Server ... // ... 在这里使用注入 的 DatabaseFixture } }Singleton Sample这里以一个对 asp.net core API 的测试为例自定义 Fixture/// summary /// Shared Context https://xunit.github.io/docs/shared-context.html /// /summary public class APITestFixture : IDisposable { private readonly IWebHost _server; public IServiceProvider Services { get; } public HttpClient Client { get; } public APITestFixture() { var baseUrl $http://localhost:{GetRandomPort()}; _server WebHost.CreateDefaultBuilder() .UseUrls(baseUrl) .UseStartupTestStartup() .Build(); _server.Start(); Services _server.Services; Client new HttpClient(new WeihanLi.Common.Http.NoProxyHttpClientHandler()) { BaseAddress new Uri(${baseUrl}) }; // Add Api-Version Header // Client.DefaultRequestHeaders.TryAddWithoutValidation(Api-Version, 1.2); Initialize(); Console.WriteLine(test begin); } /// summary /// TestDataInitialize /// /summary private void Initialize() { } public void Dispose() { using (var dbContext Services.GetRequiredServiceReservationDbContext()) { if (dbContext.Database.IsInMemory()) { dbContext.Database.EnsureDeleted(); } } Client.Dispose(); _server.Dispose(); Console.WriteLine(test end); } private static int GetRandomPort() { var random new Random(); var randomPort random.Next(10000, 65535); while (IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().Any(p p.Port randomPort)) { randomPort random.Next(10000, 65535); } return randomPort; } } [CollectionDefinition(APITestCollection)] public class APITestCollection : ICollectionFixtureAPITestFixture { }自定义Collection[CollectionDefinition(TestCollection)] public class TestCollection : ICollectionFixtureTestStartupFixture { }自定义一个 TestBase[Collection(APITestCollection)] public class ControllerTestBase { protected HttpClient Client { get; } protected IServiceProvider Services { get; } public ControllerTestBase(APITestFixture fixture) { Client fixture.Client; Services fixture.Services; } }需要依赖注入的Test类写法public class NoticeControllerTest : ControllerTestBase { public NoticeControllerTest(APITestFixture fixture) : base(fixture) { } [Fact] public async Task GetNoticeList() { using (var response await Client.GetAsync(/api/notice)) { Assert.Equal(HttpStatusCode.OK, response.StatusCode); var responseString await response.Content.ReadAsStringAsync(); var result JsonConvert.DeserializeObjectPagedListModelNotice(responseString); Assert.NotNull(result); } } [Fact] public async Task GetNoticeDetails() { var path test-notice; using (var response await Client.GetAsync($/api/notice/{path})) { Assert.Equal(HttpStatusCode.OK, response.StatusCode); var responseString await response.Content.ReadAsStringAsync(); var result JsonConvert.DeserializeObjectNotice(responseString); Assert.NotNull(result); Assert.Equal(path, result.NoticeCustomPath); } } [Fact] public async Task GetNoticeDetails_NotFound() { using (var response await Client.GetAsync(/api/notice/test-notice1212)) { Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } } }运行测试查看我们的 APITestFixture 是不是只实例化了一次查看输出日志可以看到我们输出的日志只有一次说明在整个测试过程中确实只实例化了一次只会启动一个 web server确实是单例的Memo微软推荐的是用 Microsoft.AspNetCore.Mvc.Testing 组件去测试 Controller但是个人感觉不如自己直接去写web 服务去测试如果没必要引入自己不熟悉的组件最好还是不要去引入新的东西否则可能就真的是踩坑不止了。Referencehttps://xunit.github.io/docs/shared-context.htmlhttps://github.com/WeihanLi/ActivityReservation/tree/dev/ActivityReservation.API.Test
http://wiki.neutronadmin.com/news/127458/

相关文章:

  • 学设计的网站编程app开发软件
  • 哪里网站建设专业厦门 网站建设 公司哪家好
  • 做财经类新闻的网站建设一个网站的工作方案
  • 深圳市城乡和建设局网站首页wordpress 优惠码
  • 常德网站优化哪家好wordpress eva lovia
  • 企业网站备案管理系统建设行业信息管理系统网站
  • 国内做微商城比较知名的网站镇江微信推广平台
  • 做暧暧网站在线wordpress自适应手机修改
  • 百度的合作网站有哪些简洁风格的网站模板免费下载
  • 某网站做参考文献的书写wordpress 设计
  • 中山市企业网站seo营销工具中国建设银行三峡分行网站
  • 高级营销型网站建设wordpress主题更新教程
  • 网站建设逻辑wordpress七牛缩略图
  • 河南省城乡与住房建设厅网站首页管理系统中的计算机应用
  • 凯里建设网站深圳创意设计网站
  • 企业门户网站的建设与实现论文云主机和云虚拟主机
  • 网站横向菜单湖南建站网站
  • 在上海做兼职在哪个网站商城网站建设如何
  • 公司建设网站价格未来5年网络规划设计师
  • 给网站首页图片做外网超链接_为什么会弹出一个服务器登录窗口如何建立一个网站卖东西
  • 怎么跟网站建设公司谈阿里云部署多个网站
  • wordpress如何网站顶部右侧广告做污水处理的 登录哪个网站
  • 05网课时作业答案windows优化大师在哪里
  • 电子商务网站开发项目自己做视频网站怎么处理高并发
  • 网站建设与推广实训报告册西安市社交网站制作公司
  • 网站模板哪个网站全面深圳搜索引擎优化seo
  • 网站域名变了能查吗参考文献 教学网站建设
  • 网站英文联系我们app软件开发企业
  • 湖南竞网做网站好吗网站开发是哪个
  • 自媒体网站 程序网页版原神