2010-10-12 42 views
1

我試圖使用流利的測試助手來測試AbstractRestfulFluentControllerASP.MVC並與國際奧委會

public class CustomerController : AbstractRestfulFluentController 
{ 
    private readonly IService<Customer> _customerService; 
    private readonly IService<CustomerAddress> _addressService; 

    public CustomerController(IService<Customer> customerService, IService<CustomerAddress> addressService) 
    { 
     //Assume we use these in other actions 
     _customerService = customerService; 
     _addressService = addressService; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

正如你可以看到我注射一些服務到控制器,並使用它們的解析mvccontrib流利測試國際奧委會。我的問題是,我發現在mvccontrib中使用流暢測試方法的所有示例在沒有無參數控制器的情況下都不起作用。

public void SuccessfulIndex() 
    { 
     GivenController.As<CustomerController>() 
      .ShouldRenderItself(RestfulAction.Index) 
      .WhenCalling(x => x.Index()); 
    } 

我不知道我需要做什麼才能在mvccontrib中使用IOC和流暢的測試技術。我發現了一些可能的但沒有發現的評論。我能做些什麼才能真正使用IOC和流利的測試?

回答

0

你可以寫一個方法,它允許您提供控制器的實例:

public static class GivenController 
{ 
    public static ActionExpectations<T> As<T>(T controller) where T: Controller, new() 
    { 
     return new ActionExpectations<T> { MockController = controller }; 
    } 
} 

,然後在單元測試:

var controller = CreateMockedCustomerController(); 
GivenController 
    .As<CustomerController>(controller) 
    .ShouldRenderItself(RestfulAction.Index) 
    .WhenCalling(x => x.Index()); 

的要求是:控制器應該是一個模擬對象,在我看來,這不是一個非常乾淨的方法(測試一個模擬對象)。你可以這樣創建它:

var controller = MockRepository 
    .GeneratePartialMock<CustomerController>(new object[] { dep1, dep2 }); 

注意如何將依賴關係傳遞給構造函數。

+0

這看起來是迄今爲止我最好的選擇。如果我必須做出任何額外的更改,我會發布更新。一旦確認,我會標記完成。 – Firestrand 2010-10-13 02:41:56

0

你試過屬性注入而不是構造函數注入嗎?

http://ninject.codeplex.com/wikipage?title=Injection%20Patterns

+0

我沒有。我一直試圖使用構造函數注入來貫穿應用層的通用模式。如果可能的話,我想堅持這種模式。如果不可能,那麼這可能會起作用,我會將其標記爲答案。 – Firestrand 2010-10-12 15:27:12

+0

我相信測試助手是開源的,你也可以嘗試挖掘,看看你是否能找到一個乾淨的擴展點。 – 2010-10-12 15:28:27