2009-10-05 40 views
1

我有我自己的自定義授權屬性,我試圖檢查我的控制器方法,看看他們是否有正確的角色。現在我的自定義授權標籤中包含數據庫代碼。如何在asp.net mvc中模擬AuthorizeAttribute?

我嘲笑它的方式似乎不工作,因爲我發現反射的東西似乎只是通過沒有參數,所以我的Authorize屬性中的默認構造函數被擊中創建一個新的服務層對象,創建一個存儲庫對象(殺死單元測試)。我AutorizeAttribute

public MyAuthorize() 
    { 
     authorize = new ServiceLayer(); 
    } 

    public MyAuthorize(IServicelayer layer) 
    { 
     authorize = layer; 
    } 

var indexAction = typeof(Controller).GetMethod(method); 
     var authorizeAttributes = indexAction.GetCustomAttributes(typeof(AuthorizeAttribute), true); 

     //Assert 
     Assert.That(authorizeAttributes.Length > 0, Is.True); 

     foreach (AuthorizeAttribute att in authorizeAttributes) 
     { 
      Assert.That(att.Roles, Is.EqualTo(roles)); 
     } 

構造反射的東西不斷叫我的默認構造函數。我怎樣才能通過模擬服務層或什麼?

謝謝

+0

爲什麼你有一個重載的構造函數爲屬性在所有?在應用該屬性時,您永遠無法使用重載的構造函數,因此它沒有任何好處。我懷疑它完全是爲了Testability而存在的,但是如果你也不能在生產場景中使用它,它會給我一個代碼味道。 –

+0

我不同意,馬克。這是用於測試的IoC和DI的完美可接受的方法。在實時執行過程中不採取該路線並不重要。 –

回答

0

我不認爲這個問題是你的代碼,但是你想考什麼。什麼決定了該屬性的角色?

如果您正根據傳入屬性的某些內容從服務層檢索角色,那麼測試應確認該屬性存在於其正在保護的操作(控制器測試的一部分)上,則會進行相應的調用您的服務層來自屬性(屬性測試的一部分),並且服務層爲特定請求(控制器測試的一部分)返回適當的值。

,以確保所有的零件一起工作,你將需要使用集成測試,基本上模仿整個請求管道 - 像史蒂夫·桑德森的MvcIntegrationTest應該簡化這個http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/

相關問題