2010-02-17 56 views
3

使這項工作的機制並不難,但測試它有點奇怪。該方案是我想基於基本控制器(IPrincipal對象)的User屬性將一些基本用戶數據轉儲到視圖數據中,以便母版頁始終擁有它。我需要訪問我的IUserManager(服務類),它由控制器工廠中的自定義DI提供。嘲笑用戶對測試沒有任何問題。但是,爲基本控制器中的每個操作實現此目的的最簡單方法是通過重寫OnAuthorization方法來完成此操作。然後,基類看起來是這樣的:我可以在ASP.NET MVC控制器基類中測試OnAuthorization的覆蓋嗎?

public abstract class BaseController : Controller 
{ 
    public BaseController(IUserManager userManager) 
    { 
     UserManager = userManager; 
    } 

    public IUserManager UserManager { get; private set; } 

    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     UserManager.SetupUserViewData(User, ViewData); 
    } 
} 

的問題是,有沒有辦法,我已經能夠在測試中獲得OnAuth方法火地身影。我想在我的模擬UserManager中驗證SetupUserViewData被調用。我沒有使用自定義過濾器,因爲我沒有完整的依賴注入框架(過濾器需要獲得IUserManager)。

有什麼建議嗎?因爲這將在任何地方使用,所以我想要測試的權利。

回答

8

您可以通過創建一個繼承自基本控制器的類並調用OnAuthorization方法的公共方法來實現此目的。事情是這樣的:

public class TestController : BaseController { 
    public TestController(IUserManager userManager) : base(userManager) { 
    } 

    public void CallOnAuthorization(AuthorizationContext filterContext) { 
     OnAuthorization(filterContext); 
    } 
} 

然後你測試它是這樣的:

[Test] 
public void TestMethod() { 
    var userManager = //Mock usermanager; 
    var filterContext = //Mock AuthorizationContext; 
    var controller = new TestController(userManager); 
    controller.CallOnAuthorization(filterContext); 
    //Assert here 
} 
+0

你以爲我測試了正確的事情呢?我想我可能在這裏表現得太學術了,但感覺很奇怪,因爲我假定控制器在運行時會正確執行,並且如果有授權用戶,則調用該方法。 – 2010-02-17 08:04:20

+0

好吧,如果你要測試我認爲你想要的,你會測試框架,而不是你的代碼。你必須假設你正在使用的框架已經過適當的測試。 – 2010-02-17 08:10:14

+2

順便說一句 - 您可以更輕鬆地測試OnAuthorization()方法本身,方法是將您的控制器轉換爲IAuthorizationFilter並直接調用OnAuthorization()方法。 (請注意,Controller實現IAuthorizationFilter,並且此接口委託給您的重寫方法。) – Levi 2010-02-17 09:03:33

相關問題