ASP.MVC и mvccontrib свободно тест с МОК - PullRequest
1 голос
/ 12 октября 2010

Я пытаюсь использовать беглых помощников для тестирования AbstractRestfulFluentController

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();
    }
}

Как вы видите, я внедряю некоторые службы в контроллер и решаю их с помощью IOC.Моя проблема в том, что все примеры, которые я нашел, используя беглые методы тестирования в mvccontrib, не работают без контроллера без параметров.

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

Я не уверен, что мне нужно сделать, чтобы иметь возможностьиспользовать МОК с беглыми методами испытаний в mvccontrib.Я нашел несколько комментариев, что это возможно, но ничего не нашел.Что я могу сделать, чтобы фактически использовать МОК и беглые тесты?

Ответы [ 3 ]

0 голосов
/ 12 октября 2010

У меня сейчас странная проблема, о которой я только что писал, но она должна, по крайней мере, указать вам правильное направление ... весь код предназначен для настройки внедрения зависимости.

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

0 голосов
/ 12 октября 2010

Вы можете написать метод, который позволяет вам предоставить экземпляр контроллера:

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 голосов
/ 12 октября 2010

Вы пробовали внедрять свойства вместо внедрения конструктора?

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

...