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

无数据库单元测试:LinqtoSQL分享

时间:2023-04-11 02:39:49 C#

无数据库单元测试:LinqtoSQL我有一个使用LINQtoSQL实现的存储库。虽然我没有数据库,但是我需要做单元测试。如何为FreezeAllAccountsForUser方法编写UT?你能举一个手动模拟的例子吗?注意:继承映射用于域对象注意:单元测试将使用@StuperUser评论中的VisualStudioTeamTest完成。单元测试涉及将代码与其交互的其他对象完全隔离。这意味着如果您的代码失败,您可以确定失败与被测代码有关。为此,您必须伪造这些对象。代码publicvoidFreezeAllAccountsForUser(intuserId){ListbankAccountDTOList=newList();IEnumerableaccounts=AccountRepository.GetAllAccountsForUser(userId);foreach(DBML_Project.BankAccountaccinaccounts){stringtypeResult=Convert.ToString(acc.GetType());stringbaseValue=Convert.ToString(typeof(DBML_Project.BankAccount));if(String.Equals(typeResult,baseValue)){thrownewException("派生类型不正确");}acc.Freeze();DTOLayer.BankAccountDTOForStatuspresentAccount=newDTOLayer.BankAccountDTOForStatus();presentAccount.BankAccountID=acc.BankAccountID;presentAccount.Status=acc.Status;bankAccountDTOList.Add(presentAccount);}IEnumerableel=bankAccountDTOList.Select(x=>newSystem.Xml.Linq.XElement("BankAccountDTOForStatus",newSystem.Xml.Linq.XElement("BankAccountID",x.BankAccountID),newSystem.Xml.Linq.XElement("状态",x.Status)));System.Xml.Linq.XElementroot=newSystem.Xml.Linq.XElement("root",埃尔);//AccountRepository.UpdateBankAccountUsingParseXML_SP(root);AccountRepository.Update();}存储库层namespaceRepositoryLayer{publicinterfaceILijosBankRepository{System.Data.Linq.DataContextContext{get;放;}列出GetAllAccountsForUser(intuserID);无效更新();}公共类LijosSimpleBankRepository:ILijosBankRepository{publicSystem.Data.Linq.DataContextContext{get;放;}publicListGetAllAccountsForUser(intuserID){IQueryablequeryResultEntities=Context.GetTable().Where(p=>p.AccountOwnerID==userID);返回queryResultEntities.ToList();}publicvirtualvoidUpdate(){//Context.SubmitChanges();}}}域类namespaceDBML_Project{publicpartialclassBankAccount{//定义域行为publicvirtualvoidFreeze(){//什么都不做}}publicclassFixedBankAccount:BankAccount{publicoverridevoidFreeze(){this.Status="冷冻FA”;}}publicclassSavingsBankAccount:BankAccount{公共覆盖idevoidFreeze(){this.Status="FrozenSB";}}}LINQtoSQL自动生成的类[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.BankAccount")][InheritanceMapping(Code="Fixed",Type=typeof(FixedBankAccount),IsDefault=true)][InheritanceMapping(Code="Savings",Type=typeof(SavingsBankAccount))]publicpartialclassBankAccount:INotifyPropertyChanging,INotifyPropertyChangedINotifyPropertyChanged存储库的职责是持久保存域对象并根据请求获取它们,即它的工作是获取一个对象并将其反序列化/序列化为某种形式的持久存储。因此,对存储库的测试必须针对真实存储进行测试,在本例中为数据库。即这些是集成测试-测试您的班级与外部数据库的集成。一旦确定了这一点,客户端/应用程序的其余部分就不必针对真实数据库工作。他们可以模拟存储库并进行快速单元测试。您可以假设GetAccount在集成测试通过后仍然可以工作。更多详细信息:通过将Repository对象作为ctor或方法arg传递,您打开了传递伪造或模拟的大门。所以现在服务测试可以在没有真实存储库的情况下运行>>没有数据库访问>>快速测试。publicvoidFreezeAllAccountsForUser(intuserId,ILijosBankRepositoryaccountRepository){//你的代码和以前一样}test(){varmockRepository=newMock();varservice=//创建包含FreezeAllAccounts的对象...service.FreezeAllAccounts(SOME_USER_ID,mockRepository);mock.Verify(r=>r.GetAllAccountsForUser(SOME_USER_ID);mock.Verify(r=>r.Update());}简而言之,你不能。存储库实现的唯一目的是与数据库通信.所以数据库技术很重要,你应该执行集成测试。单元测试这个代码是不可能的,因为LINQtoObjects是LINQtoSQL的超集。你可以有一个绿色的单元测试,并且在使用真正的数据库异常时仍然可以获得运行时,因为您正在使用无法转换为SQL的存储库中的LINQ功能。您可以在数据上下文中使用IDbSet接口并提取数据上下文类的接口。对接口进行编程是创建单元可测试代码的关键。您想要提供这些linq查询创建单元测试的原因是对逻辑查询进行单元测试。集成测试会受到各种误报的影响。数据库状态不正确,其他查询并发运行,其他集成测试等。它是很难很好地隔离数据库以进行可靠的集成测试。这就是集成测试经常被忽视的原因。如果一定要选一个,我更喜欢单元测试...以上是C#学习教程:unittestingwithoutdatabase:LinqtoSQL所有分享的内容,如果对大家有用还需要进一步了解C#学习教程,希望大家注意——本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: