这也是C#代码吗 --- 代码阅读性进阶:测试文档化
没有太多的罗嗦,代码本身已经足够。如果,要添几个标签的话就是: 中文化,流畅性接口(Fluent Interface),API.
只有几点补充说明:
1。 这都是真实可运行的代码,请看测试状态: 点击Login as guest
2。 测试使用Machine Specification, 重点是Establish部分。
3。仅仅使用于集成测试(用户故事);不建议业务领域和单元测试使用。
4。这里只列出最终使用代码(测试说明一切);避免细节/实现的干扰。实现请看: Examples.cs "一个“语法的实现 ”要“语法实现
文章发布后,很多的评论,特作出以下解释:
- 这一段代码的技术重点,首先是行为驱动开发(BDD), 偏重于需求描述(测试用例),而轻编程能力。
- 第二个技术点,流畅型接口, 对内是功能封装,对外是使用接口(API). 用Facade模式来看待,会更好理解。如果在功能实现内部使用Facade当然会头痛。
- 最后,才是使用中文。即使,不用中文,前两点也会很有用。
- 我是实践派,不是学院派。这是我实际项目的真实代码,不是为了装酷。
得心应手武器库:
MSpec
本文所涉及使用的工具, 见前文:我的.Net武器库 ------ 新.Net架构必备工具列表
使用的视屏演示:
1 using System.Linq; 2 using Machine.Specifications; 3 using Skight.Arch.Domain; 4 using Skight.Arch.Domain.Core.Containers; 5 using Skight.Arch.Domain.Extensions; 6 using Skight.Arch.UserStories.Helpers; 7 using Skight.ES.Register.Presentation; 8 using Skight.ES.Register.Presentation.Modal; 9 using Skight.ES.Register.Presentation.Web.Application; 10 using Skight.ES.Register.Presentation.Web.ExamDistrictAdmin; 11 using Skight.ES.Register.Services; 12 using Skight.ES.Register.UserStories.Helpers; 13 14 namespace Skight.ES.Register.UserStories.作为.考区组考人.我想查看考试从而可以了解考试信息 15 { 16 [Subject("考试"), Tags("集成测试", "用户故事")] 17 public class 当浏览某考试界面 : CommandTestBase 18 { 19 private Establish that = 20 () => 21 { 22 要.创建(示例.考区.省直); 23 24 要.创建(示例.考试定义.计算机) 25 .添加科目(示例.科目.AutoCAD) 26 .添加科目(示例.科目.Windows2000) 27 .添加科目(示例.科目.WindowsExcel); 28 29 要.创建(示例.考试.省直2012年1月计算机考试) 30 .设为电子化考试() 31 .设置考试起始时间(Date.Of(2012,1,1),Date.Of(2012,2,1)) 32 .设置审核() 33 .设置考场容量(50) 34 .设置科目费用(Money.of(100)) 35 .添加科目(示例.科目.AutoCAD) 36 .添加科目(示例.科目.Windows2000) 37 .添加科目(示例.科目.WindowsExcel) 38 .添加个人信息定义(示例.个人信息定义.姓名) 39 .添加个人信息定义(示例.个人信息定义.性别) 40 .添加个人信息定义(示例.个人信息定义.身份证) 41 .添加考场(示例.考场信息定义.考场01) 42 .添加考场(示例.考场信息定义.考场02) 43 .添加考场(示例.考场信息定义.考场03); ; 44 45 var exam_service = Container.get<ExamService>(); 46 subject = new ExamDetailGet(exam_service); 47 ui.load_context_data(Keys.Context.ExamDate.with_value(示例.考试.省直2012年1月计算机考试)); 48 }; 49 50 private Because of = 51 () => 52 { 53 subject.process(ui); 54 result = ui.get_model<ExamDetailDTO>(Views.DisplayExamDetail); 55 }; 56 57 private It 应该显示考试科目列表 = 58 () => result.Subjects.Select(s=>s.Code) 59 .ShouldContainOnly(示例.科目.AutoCAD.Code, 示例.科目.Windows2000.Code, 示例.科目.WindowsExcel.Code); 60 61 private It 应该显示考试开始日期 = 62 () => result.BeginDate.ShouldEqual(Date.Of(2012, 1, 1)); 63 private It 应该显示考试结束日期 = 64 () => result.EndDate.ShouldEqual(Date.Of(2012, 2, 1)); 65 66 private It 应该显示是否电子化考试 = 67 () => result.IsElectronicExam.ShouldBeTrue(); 68 private It 应该显示是考试考场容量 = 69 () => result.ExaminationRoomCapacity.ShouldEqual(50); 70 71 private It 应该显示是否考试报名需要审核 = 72 () => result.NeedInspection.ShouldBeTrue(); 73 private It 应该显示考试默认科目费用 = 74 () => result.DefaultCharge.ShouldEqual(Money.of(100)); 75 76 private It 应该显示报考人员信息项目 = 77 () => result.PersonalInfoDefs.ShouldContainOnly(示例.个人信息定义.姓名, 示例.个人信息定义.身份证, 示例.个人信息定义.性别); 78 79 private It 应该显示考试相关考场信息 = 80 () => result.Scenes.ShouldContainOnly(示例.考场信息定义.考场01, 示例.考场信息定义.考场02, 示例.考场信息定义.考场03); 81 82 private static ExamDetailGet subject; 83 private static ExamDetailDTO result; 84 } 85 }
皓月碧空,漫野如洗,行往卓越的路上