当前位置: 首页 > 编程语言 > C#

如何为实际使用我的数据库上下文的ASP.NETCore控制器编写单元测试?

时间:2023-04-10 20:15:04 C#

我如何为实际使用我的数据库上下文的ASP.NETCore控制器编写单元测试?似乎没有关于如何为实际的ASP.NETCore控制器操作编写好的单元测试的任何信息。关于如何使这项工作成为现实的任何指导?我有一个目前似乎运行良好的系统,所以我想我会分享它,看看它是否对其他人有帮助。实体框架文档中有一篇非常有用的文章指出了方法。但这里是我如何将它合并到一个实际的工作应用程序中。1.在解决方案中创建ASP.NETCoreWebApp有很多很棒的文章可以帮助您入门。基本设置和脚手架的文档非常有帮助。为此,您需要创建一个具有个人用户帐户的Web应用程序,以便将您的ApplicationDbContext设置为自动使用EntityFramework。1A.搭建控制器脚手架使用文档中包含的信息创建具有基本CRUD操作的简单控制器。2.为单元测试创??建单独的类库在您的解决方案中,创建一个新的.NETCore库并引用您新创建的Web应用程序。在我的示例中,我使用的模型称为Company,它使用CompaniesController。2A.将必要的包添加到测试库对于这个项目,我使用xUnit作为我的测试运行器,使用Moq来模拟对象,使用FluentAssertions来创建更有意义的断言。使用NuGet包管理器和/或控制台将这三个库添加到您的项目中。您可能需要勾选显示售前赛复选框来搜索它们。您还需要一些包才能使用EntityFramework的新Sqlite-InMemory数据库选项。这是食谱。下面是NuGet上的包名称列表:3.设置测试Fixture根据我之前提到的文章,有一种简单、漂亮的方法可以将Sqlite设置为可以测试的内存中关系数据库。您将需要编写单元测试方法,以便每个方法都有一个新的、干净的数据库副本。上面的文章向您展示了如何一次性完成此操作。这是我将夹具设置为尽可能干燥的方法。3A.同步控制器操作我编写了以下方法,允许我使用Arrange/Act/Assert模型编写测试,每个阶段都充当我测试中的参数。下面是该方法的代码和它引用的TestFixture中的相关类属性,最后是调用代码的示例。公共类TestFixture{publicSqliteConnectionConnectionFactory()=>newSqliteConnection("DataSource=:memory:");publicDbContextOptionsDbOptionsFactory(SqliteConnectionconnection)=>newDbContextOptionsBuilder().UseSqlite(connection).Options;公共公司>新公司{Name=Guid.NewGuid().ToString()};publicvoidRunWithDatabase(Actionarrange,Funcact,Actionassert){varconnection=ConnectionFactory();connection.Open();try{varoptions=DbOptionsFactory(connection);使用(varcontext=newApplicationDbContext(options)){context.Database.EnsureCreated();//安排arrange?.Invoke(context);}using(varcontext=newApplicationDbContext(options)){//执行(并将结果传递给断言)varresult=act.Invoke(context);//断言assert.Invoke(result);}}最后{connection.Close();}}...}以下是测试CompaniesController上的Create方法的调用代码(我使用参数名称来帮助我保持表达式直接,但你并不严格需要它们):[事实]public无效的Get_RreturnsAViewResult(){_fixture.RunWithDatabase(arrange:null,act:context=>newCompaniesController(context,_logger).Create(),assert:result=>result.Should().BeOfType());我的CompaniesController类需要一个记录器,我用Moq模拟它并将其作为变量3B存储在我的TestFixture中。异步控制器动作当然,许多内置的ASP.NETCore动作都是异步的。为了使用这个结构,我写了下面的方法:等待连接.OpenAsync();尝试{varoptions=DbOptionsFactory(connection);使用(varcontext=newApplicationDbContext(options)){awaitcontext.Database.EnsureCreatedAsync();如果(安排!=null)等待安排。调用(上下文);}使用(varcontext=newApplicationDbContext(options)){varresult=awaitact.Invoke(context);断言。调用(结果);}}最后{connection.Close();几乎完全一样,只是使用异步方法和等待或设置。下面是一个调用这些方法的例子:,act:asynccontext=>awaitnewCompaniesController(context,_logger).Edit(1,CompanyFactory()),assert:result=>result.Should().BeOfType());}3C。数据的异步操作当然,有时您必须在测试阶段之间来回传递数据。这是我写的一个允许你这样做的方法:等待连接.OpenAsync();尝试{对象数据;varoptions=DbOptionsFactory(连接);使用(varcontext=newApplicationDbContext(options)){awaitcontext.Database.EnsureCreatedAsync();数据=排列!=空?等待安排?调用(上下文):空;}使用(varcontext=newApplicationDbContext(options)){varresult=awaitact.Invoke(context,data);断言。调用(结果,数据);}}最后{connection.Close();}}}当然,这是我如何使用这段代码的一个例子:“名称不能为空”,Company=CompanyFactory()};context.Company.Add(data.Company);awaitcontext.SaveChangesAsync();returndata;},act:async(context,数据)=>{varctrl=newCompaniesController(context,_logger);ctrl.ModelState.AddModelError(data.Key,data.Message);返回等待ctrl.Edit(1,data.Company);},断言:(result,data)=>result.As().ViewData.ModelState.Keys.Should().Contain((string)data.Key));}结论我真的希望这能帮助一些人站起来使用C#和ASP.NETCore中令人敬畏的新东西如果您有任何问题、批评或建议,请告诉我!我也是新手,所以任何建设性的反馈对我来说都是无价的!C#学习教程就是这些:如何为实际使用我的数据库上下文的ASP.NETCore控制器编写单元测试?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: