2010-10-12 7 views
1

Я пытаюсь использовать беглый тест помощник для тестирования AbstractRestfulFluentControllerASP.MVC и mvccontrib свободно испытание с МОК

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, не работают без контроллера без партитуры.

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

Я не уверен, что мне нужно сделать для того, чтобы иметь возможность использовать МОК с плавными методами испытаний в mvccontrib. Я нашел несколько комментариев, что это возможно, но ничего не нашел. Что я могу сделать, чтобы на самом деле использовать 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

0

Вы попробовали инъекцию свойств вместо инъекции конструктора?

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

+0

У меня нет. Я пытаюсь придерживаться общего шаблона на всех уровнях приложения, используя инсталляцию конструктора. Я хотел бы придерживаться этой схемы, если это возможно. Если это невозможно, это может сработать, и я буду отмечать его как ответ. – Firestrand

+0

Я считаю, что тестовые помощники с открытым исходным кодом, вы также можете попробовать выполнить копание и посмотреть, можете ли вы найти чистую точку расширения. –

0

я в настоящее время имеющие странный Ninject вопрос, который я только что отправленным о, но это должно, по крайней мере момент вы в правильном направлении ... весь код там для установки инъекции зависимостей.

https://stackoverflow.com/questions/3909452/unit-testing-asp-net-mvc-controllers-with-ninject