2009-06-01 80 views
5

我一直在試圖找到一些關於這方面的直接信息,但我一直沒有能力 - 要麼我發現已經模糊了我,以瞭解發生了什麼事情,或對錯誤的事情太具體,例如我發現的單元測試AuthorizeAttribute的教程。 (第三種方法當然是我太愚蠢意識到,我在讀我找......在這種情況下,我仍然需要幫助的信息,因爲我是啞巴:P)如何UnitTest自定義ActionFilter?

我希望能夠測試兩件事情:

  1. 給定ActionFilter應用於行動(以確保行動符合要求)
  2. 給定ActionFilter做什麼它應該做的。

而且我無言以對。任何人都可以將我推向正確的方向,以至於我真的需要測試什麼?我的Arrange,Act和Assert部分應該包含什麼內容?


一個小細節,如果我不夠清晰:

我有一個應該檢查兩個提交的表單值是相同的,如果不加ModelStateError一個CustomValidationFilter。我想驗證所加入的錯誤與正確的錯誤消息,如果值是不一樣的,而且該錯誤是添加如果值相等(且非空)。

我也有一個GuestbookController一個Write行動。我想驗證過濾器是否適用於此操作。

+0

你能不能發佈您的工作代碼呢?我儘可能地創建了屬性,但是我在ResultExecutingContext中傳遞了問題。 – 2009-07-17 19:33:53

+0

嗨馬克!我的代碼可在http://snipplr.com/users/RockinForGod/ – 2009-07-21 13:58:49

回答

4

在測試中使用反射。

var method = typeof(MyController).GetMethod("MyMethod"); 
    var attribute = method.GetCustomAttributes(typeof(CustomValidationFilter),false); 
         .Cast<CustomValidationFilter>() 
         .SingleOrDefault(); 

    Assert.IsNotNull(attribute); 
    Assert.AreEqual("value", atttribute.SomeProperty); 

爲班級中的方法創建單元測試。用適當的數據模擬filterContext並檢查方法應該設置的任何變量,實際上是你期望它們是什麼。

public void AttributeTest() 
{ 
    var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    var controller = new FakeController(); 
    controller.controllerContext = new ControllerContext(httpContext, new RouteData(), controller); 
    ... 

    attribute.OnActionExecuting(filterContext); 

    Assert... 

}