2010-06-16 45 views
1

我正在爲我們的WCF RIA服務進行單元測試,這些服務有RequiresRoleRequiresAuthentication屬性附加到它們。我已經能夠測試更新,插入和刪除方法,以確保正確設置屬性。這是通過嘲笑IServiceProvider,與該提供商和正確的DomainOperationType創建DomainServiceContext,向服務提供商添加IPrincipal服務,然後在適當的ChangeSet上運行Submit()服務。這似乎運作良好。如何編寫單元測試來驗證WCF-RIA服務的DomainService查詢方法是否需要驗證?

但是,我一直無法測試查詢調用。這些通過服務上的Query()方法調用。因此,我正在做與其他人一樣的準備工作(創建IServiceProvider,DomainServiceContext和和IPrincipal)並嘗試創建適當的DomainOperationEntryQueryDescription以傳遞到Query()。不幸的是,我還沒有任何運氣。相關的代碼是:

string operationName = "GetUsers"; 
DomainServiceContext domainServiceContext = GetDomainServiceContext(
    authenticate: false, 
    operationType: DomainOperationType.Query); 
DomainOperationQuery operationQuery = mocks.DynamicMock<DomainOperationEntry>(
    typeof(UserService), operationName, DomainOperation.Query, 
    typeof(IQueryable<User>), new List<DomainOperationParameter>(), 
    new AttributeCollection()); 
mocks.ReplayAll(); 

service.Initialize(domainServiceContext); 

int totalCount; 
IEnumerable<ValidationResult> validationErrors; 
QueryDescription = new QueryDescription(operationEntry); 

service.Query(queryDescription, out ValidatoinErrors, out TotalCount); 

這應該拋出UnauthorizedAccessException,當RequiresAuthentication設置在GetUsers查詢。但是,無論屬性是否設置,我都沒有得到任何東西。使用在GetUsers方法中設置斷點的調試器,我可以看到該方法從不被調用。我的猜測是我得到了operationName錯誤。但我不知道這是否是問題,或者,如果是這樣,我應該改變它。

有沒有人有這方面的見解?我已經通過MSDN搜索了所有內容,並進行了Google搜索並在這裏進行了廣泛搜索。到目前爲止,我一無所獲。

回答

1

我覺得有兩兩件事要做,當單元測試授權:

首先,檢查權的規則已經被應用。你不必爲此執行規則。反思會告訴你是否應用了正確的規則。這是規則以聲明方式應用的事實的副產品。更具體地說,您可以使用更高級別的API以及超越反射 - DomainServiceDescription針對DomainService類型。

接下來,測試規則做它應該做的事情。爲此,創建一個IPrincipal的模擬實現和一個AuthorizationContext,並調用AuthorizationAttribute的IsAuthorized方法(其中每個屬性對應於您要單元測試的規則)。

希望有所幫助。

+0

首先,感謝您的回覆。我實際上剛開始做第一次測試...從此以後就沒有在這裏檢查過。其次,我不清楚如何做第二個。作爲一個例子,我應該測試一下,當IPrincipal具有正確的角色時,通過AuthorizationContext將RequiresRole應用於IPrincipal會有效嗎?顯然,我會測試一個自定義的授權規則,因爲我認爲RequiresRole確實有效:)換句話說,測試授權規則。 – 2010-07-23 14:02:38