沒有太多的羅嗦,代碼本身已經足夠。如果,要添幾個標簽的話就是: 中文化,流暢性接口(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 }