#副標=ASP.NET網站開發與應用(10) #大標=在分析設計階段導入系統安全防護的需求 #作者=文/圖王寧疆 =========box 範例1======== public class Account {   private float balance;   //存放帳戶餘額的變數 public void Deposit(float amount)   //存款功能 { balance += amount; //將存款的數量加入到帳戶餘額 } public void Withdraw(float amount)   //取款功能 { if (amount <= Balance)     //如果取款數量未超過帳戶餘額 { balance -= amount; //從帳戶餘額減去取款數量 } Else     //如果取款額度超過帳戶餘額 { //顯示錯誤訊息 } } public void TransferFunds(Account destination, float amount)   //轉帳功能 { Withdraw(amount); //對來源帳戶執行取款的動作 destination.Deposit(amount); //對目標帳戶執行存款的動作 } public float Balance   //查詢帳戶餘額的屬性 { get { return balance; } //傳回存放帳戶餘額的變數的內容值 } } ============end=========== =========box 範例2======== [TestClass()] public class AccountTest //定義AccountTest為測試類別 {   Account source=null;   //宣告來源帳戶物件 Account destination=null;   //宣告目標帳戶物件 [TestInitialize()] public void SetUp() //定義執行單元測試初始化的方法 { source = new Account(); //建立來源帳戶物件 source.Deposit(200.00F); //存入200元到來源帳戶 destination = new Account(); //建立目標帳戶物件 destination.Deposit(150.00F); //存入150元到目標帳戶 } [TestMethod()] public void TransferFundsTest()   //定義測試轉帳功能的測試案例 { source.TransferFunds(destination, 100.00F); //從來源帳戶轉100元到目標帳戶 Assert.AreEqual(250.00F, destination.Balance, "目標帳戶餘額錯誤");     //如果目標帳戶的餘額不為250元,則顯示錯誤訊息 Assert.AreEqual(100.00F, source.Balance, "來源帳戶餘額錯誤");     //如果來源帳戶的餘額不為100元,則顯示錯誤訊息 } } ============end=========== ===========box 注意========= Visual Studio自動建立的單元測試專案只會對ASP.NET MVC網站的Controlller類別的功能進行測試,如果要對MVC網站中的View模組和Model模組進行測試,必須自行設計相關的單元測試功能。 ==============end============ =========box 範例3======== [TestClass] public class HomeControllerTest //宣告HomeControllerTest類別為測試類別 { [TestMethod] public void Index()  //宣告測試HomeController類別的Index方法的測試案例 { // Arrange HomeController controller = new HomeController();   //建立HomeController類別的物件 // Act ViewResult result = controller.Index() as ViewResult; //呼叫HomeController類別的Index方法並取回呼叫的結果 // Assert ViewDataDictionary viewData = result.ViewData; //取出呼叫結果中的ViewData集合 Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]); //判斷ViewData集合中鍵值為Message的內容是否為: //Welcome to ASP.NET MVC! } [TestMethod] public void About()   //宣告測試HomeController類別的About方法的測試案例 { // Arrange HomeController controller = new HomeController(); //建立HomeController類別的物件 // Act ViewResult result = controller.About()     as ViewResult;     //呼叫HomeController類別的About方法並取回呼叫的結果 // Assert Assert.IsNotNull(result); //判斷呼叫的結果是否具有內容值 } } ============end=========== =========box 範例4======== private static AccountController GetAccountController() { IFormsAuthentication formsAuth =   new MockFormsAuthenticationService();   //建立MockFormsAuthenticationService類別的物件 MembershipProvider membershipProvider = new MockMembershipProvider(); //建立MockMembershipProvider類別的物件 AccountMembershipService membershipService = new AccountMembershipService( membershipProvider); //建立AccountMembershipService類別的物件 AccountController controller = new AccountController(formsAuth,   membershipService);   //利用MockMembershipProvider類別的物件和   //AccountMembershipService類別的物件建立AccountController類別的物件 ControllerContext controllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), controller); //建立負責定義Controller執行環境的ControllerContext物件 controller.ControllerContext = controllerContext;   //設定Controller的執行環境 return controller; } ============end=========== =========box 範例5======== public override int MinRequiredPasswordLength { get { return 6; } } ============end=========== =========box 範例6======== public override int PasswordAttemptWindow { get { return 3; } } ============end=========== =========box 範例7======== public override bool ValidateUser (string username, string password) { return password.Equals("goodPass"); } ============end=========== =========box 範例8======== public override MembershipUser CreateUser (string username, string password, string email, string  passwordQuestion, string passwordAnswer,  bool isApproved, Object providerUserKey,  out MembershipCreateStatus status) { MockMembershipUser user =   new MockMembershipUser();   //建立負責管理網站使用者身份資訊的MockMembershipUser類別 if (username.Equals("someUser") &&     password.Equals("goodPass") && email.Equals("email"))   //依據參數中的帳號、密碼、和電子郵件判斷使用者是否登入成功 { status = MembershipCreateStatus.Success; //設定身份驗証成功的狀態 } else //使用者身份驗証失敗 { // the 'email' parameter contains the status we want to return to the user status = (MembershipCreateStatus)Enum.Parse     (typeof(MembershipCreateStatus), email); //設定身份驗証失敗的狀態 } return user;   //傳回所建立的網站使用者 } ============end=========== =========box 範例7======== [TestMethod] public void ChangePasswordGetReturnsView() { // Arrange AccountController controller = GetAccountController();  //建立AccountController類別的物件 // Act ViewResult result = (ViewResult)controller.ChangePassword(); //呼叫AccountController類別的ChangePassword //方法,執行變更網站使用者密碼的工作 // Assert Assert.AreEqual(6, result.ViewData["PasswordLength"]); //確定變更後的密碼的長度至少為6個字元 } ============end=========== =========box 範例8======== Assert.AreEqual(6,  result.ViewData["PasswordLength"]);  //確定變更後的密碼的長度至少為6個字元 ============end=========== =========box 範例9======== Assert.AreEqual("變更密碼成功!", result.ViewData["ChangePasswordResult"]); ============end=========== =========box 範例10======== [Authorize] [AcceptVerbs(HttpVerbs.Post)] [System.Diagnostics.CodeAnalysis. SuppressMessage("Microsoft.Design",  "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions result in password not being changed.")] public ActionResult ChangePassword (string currentPassword, string newPassword, string confirmPassword) { if (!ValidateChangePassword (currentPassword, newPassword, confirmPassword)) //如果密碼不符合網站的規定 { ViewData["ChangePasswordResult"] = "密碼錯誤!"; //將錯誤訊息填入ViewData集合中 return View();//顯示名稱為ChangePassword的View } try { if (MembershipService.ChangePassword (User.Identity.Name, currentPassword, newPassword)) //執行更改密碼的動作成功 { ViewData["ChangePasswordResult"]="變更密碼成功!"; //將成功訊息填入ViewData集合中 return RedirectToAction("ChangePasswordSuccess"); //執行ChangePasswordSuccess方法 } Else //執行更改密碼的動作失敗 { ViewData["ChangePasswordResult"] =      "新密碼未符合網站規定!";       //將錯誤訊息填入ViewData集合中 //在ModelState中記錄錯誤訊息 ModelState.AddModelError("_FORM", "The current password is incorrect or the new password is invalid."); return View(); //顯示名稱為ChangePassword的View } } catch //處理變更密碼引發的例外 { //在ModelState中記錄錯誤訊息 ModelState.AddModelError("_FORM",    "The current password is incorrect    or the new password is invalid."); return View(); //顯示名稱為ChangePassword的View } } ============end=========== =========box 範例11======== [TestMethod] public void ChangePasswordPostReturns ViewIfCurrentPasswordNotSpecified() { // Arrange AccountController controller = GetAccountController(); //建立AccountController類別的物件 // Act ViewResult result = (ViewResult)controller. ChangePassword("", "newPassword", "newPassword"); //執行變更密碼的工作,但是未提供密碼的內容 // Assert Assert.AreEqual("密碼錯誤!", result.ViewData["ChangePasswordResult"]); //判斷ViewData集合中鍵值為 //ChangePasswordResult的元素的內容是否為: 密碼錯誤! Assert.AreEqual("You must specify a current password.", result.ViewData.ModelState ["currentPassword"].Errors[0].ErrorMessage); //判斷ModelState中是否有出現正確的錯誤訊息 } ============end===========