測試MVC應用程式

2021-06-16 07:30:24 字數 3836 閱讀 2292

本教程的目的是解釋如何為 asp.net mvc 應用程式中的控制器編寫單元測試。我們將討論如何建立三種不同型別的單元測試。您將了解如何測試控制器操作返回的檢視、如何測試控制器操作返回的檢視資料,以及如何測試乙個控制器操作是否重定向到另乙個控制器操作。

建立測試控制器

我們首先建立要測試的控制器。程式清單 1 中包含名稱為 productcontroller 的控制器。

程式清單 1 productcontroller.cs

using system;

using system.web.mvc; namespace store.controllers

public actionresult details(int id)}}

homecontroller 包含兩個操作方法,名稱為 index() 和 details()。兩個操作方法都返回乙個檢視。請注意, details() 操作接受名稱為 id 的引數。

測試控制器返回的檢視

假設要測試 productcontroller 是否返回正確的檢視。希望確保當啟用 productcontroller.details() 操作時,返回 details 檢視。程式清單 2 中的測試類包含乙個單元測試,用於測試由 productcontroller.details() 操作返回的檢視。

程式清單 2 productcontrollertest.cs

using system.web.mvc;

using microsoft.visualstudio.testtools.unittesting;

using store.controllers; namespace storetests.controllers}}

程式清單 2 中的類包含名稱為 testdetailsview() 的測試方法。此方法包括三行**。第一行**建立乙個 productcontroller 類的新例項。第二行**啟用控制器的 details() 操作方法。最後一行**檢查 details() 操作返回的是否是 details 檢視。

viewresult.viewname 屬性代表由控制器返回的檢視的名稱。測試該屬性時需要特別小心。控制器返回檢視有兩種方法。控制器可以顯式地返回檢視,如下所示:

public actionresult details(int id)

另外,檢視的名稱可以引用控制器操作的名稱,如下所示:

public actionresult details(int id)

此控制器操作也返回名稱為 details 的檢視。然而,檢視的名稱引用自操作的名稱。如果想要測試檢視名稱,則必須顯式地從控制器操作返回檢視名稱。

通過按 ctrl-r,a 組合鍵或單擊 run all tests in solution 按鈕(如圖 1 所示),可以執行程式清單 2 中的單元測試。如果通過測試,則將看到如圖 2 所示的 test results 視窗。

圖 1:執行解決方案中的所有測試

圖 2:成功!

測試控制器返回的 view data

mvc 控制器使用 view data 將資料傳遞給檢視。例如,假設想要在啟用 productcontroller details() 操作時顯示某個產品的詳細資訊。在這種情況下,可以建立 product 類的例項(在模型中定義),然後利用 view data 將例項傳遞給 details 檢視。

程式清單 3 中修改後的 productcontroller 包含更新的 details() 操作,它返回 product。

程式清單 3 productcontroller.cs

using system;

using system.web.mvc;

namespace store.controllers

public actionresult details(int id)}}

首先,details() 操作建立 product 類的新例項表示膝上型電腦。接下來,product 類的例項被作為第二個引數傳遞給 view() 方法。

可以編寫測試單元測試預期的資料是否包含在檢視資料中。程式清單 4 中的單元測試用於測試表示膝上型電腦的 product 是否在呼叫 productcontroller details() 操作方法時返回。

程式清單 4 productcontrollertest.cs

using system.web.mvc;

using microsoft.visualstudio.testtools.unittesting;

using store.controllers;

namespace storetests.controllers}}

在程式清單 4 中,testdetailsview() 方法通過啟用 details() 方法測試返回的 view data。viewdata 公開為 viewresult(通過啟用 details() 方法返回)上的乙個屬性。viewdata.model 屬性包含傳遞給檢視的產品。測試只是簡單地驗證包含在 view data 中的產品名稱是 laptop。

測試控制器返回的操作結果

較複雜的控制器操作可能返回不同型別的操作結果,具體取決於傳遞給控制器操作的引數值。控制器操作可以返回各種型別的操作結果,包括 viewresult、redirecttorouteresult 或 jsonresult。

例如,程式清單 5 中修改的 details() 操作在將有效 id 傳遞給操作時返回 details 檢視。如果傳遞無效的產品 id(id 的值小於 1),則將重定向到 index() 操作。

程式清單 5 productcontroller.cs

using system;

using system.web.mvc;

namespace store.controllers

public actionresult details(int id)}}

可以使用程式清單 6 中的單元測試來測試 details() 操作的行為。程式清單 6 中的單元測試驗證當 id 值 -1 被傳遞到 details() 方法時是否重定向到 index 檢視。

程式清單 6 productcontrollertest.cs

using system.web.mvc;

using microsoft.visualstudio.testtools.unittesting;

using store.controllers;

namespace storetests.controllers}}

在呼叫控制器操作的 redirecttoaction() 方法時,控制器操作返回 redirecttorouteresult。測試用於檢查 redirecttorouteresult 是否將使用者重定向到名稱為 index 的控制器操作。

總結

在本教程中,我們學習了如何為 mvc 控制器操作構建單元測試。首先,我們學習了如何驗證控制器操作是否返回正確的檢視。學習了如何使用 viewresult.viewname 屬性驗證檢視的名稱。

接下來,我們研究了如何測試 view data 的內容。學習了如何檢查呼叫控制器操作後 view data 中是否返回正確的產品。

最後,我們討論了如何測試控制器操作是否返回不同型別的操作結果。學習了如何測試控制器操作是返回 viewresult 還是 redirecttorouteresult。

MVC應用程式使用Wcf Service

前一篇insus.net有演示過mvc應用程式使用web service,此篇insus.net想繼續演示service,不過是wcf service。兩者實施起來,多少有些不一樣。在services目錄下,建立乙個calculator.svc 服務。建立成功之後,它會生生成乙個介面以及乙個svc的...

IIS發布MVC應用程式問題

1.iis7.5詳細錯誤 http 錯誤 500.19 internal server error 無法訪問請求的頁面,因為該頁的相關配置資料無效 重複定義了 system.web.extensions scripting scriptresourcehandler 解決方法 直接刪除整個,網上說的...

MVC應用程式實現會員登入功能

實現之前,我們已經把驗證成功的資訊存在cookie裡 mvc登入前準備寫好cookie 現在就可以實現真正的驗證與登入了。先去資料庫,寫好乙個登入證的儲存過程 dbo usp member loginverifyandgetinfo 儲存過程中有兩個判斷,使用者輸入乙個不存在的帳號,也要提示帳號或是...