Действия контроллера модульного тестирования в MVC4 с пользовательским интерфейсом Kendo

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

public class ClientController : Controller
{

    [HttpPost]
    public ActionResult Create(Client client, [DataSourceRequest] DataSourceRequest request)
    {
        if (ModelState.IsValid)
        {
            clientRepo.InsertClient(client);
        }

        return Json(new[] {client}.ToDataSourceResult(request, ModelState));
    }
}

Модульный тест для этого выглядит следующим образом:

[Test]
public void Create()
{
        // Arrange
        clientController.ModelState.Clear();

        // Act
        JsonResult json = clientController.Create(this.clientDto, this.dataSourceRequest) as JsonResult;

        // Assert
        Assert.IsNotNull(json);

}

И контекст контроллера подделывается с помощью следующего кода:

 public class FakeControllerContext : ControllerContext
    {
        HttpContextBase context = new FakeHttpContext();

        public override HttpContextBase HttpContext
        {
            get
            {
                return context;
            }
            set
            {
                context = value;
            }
        }

    }

    public class FakeHttpContext : HttpContextBase
    {
        public HttpRequestBase request = new FakeHttpRequest();
        public HttpResponseBase response = new FakeHttpResponse();

        public override HttpRequestBase Request
        {
            get { return request; }
        }

        public override HttpResponseBase Response
        {
            get { return response; }
        }
    }

    public class FakeHttpRequest : HttpRequestBase
    {

    }

    public class FakeHttpResponse : HttpResponseBase
    {

    }


}

Исключение возникает, когда действие контроллера Create пытается вызвать метод ToDataSourceResult.

System.EntryPointNotFoundException : Entry point was not found.

Отладка показывает, что внутренний словарь ModelState пуст в модульном тесте (а не при запуске в стандартном контексте). Если ModelState удалить из метода ToDataSourceResult, то тест проходит успешно. Буду признателен за любую оказанную помощь.


person Alex    schedule 19.06.2013    source источник


Ответы (1)


Быстрый просмотр JustDecompile показывает, что Kendo.Web.Mvc.dll был создан для System.Web.Mvc версии 3.0. Ваш тестовый проект, вероятно, ссылается на более новую версию ASP.NET MVC (4.0), поэтому во время выполнения любые вызовы System.Web.Mvc участников приводят к созданию System.EntryPointNotFoundException, так как эти члены не могут быть разрешены. В вашем конкретном случае виновником был вызов метода расширения KendoUI MVC ToDataSourceResult() и его последующий вызов ModelState.IsValid.

Причина, по которой все это работает без ошибок в вашем приложении, заключается в том, что ваш проект по умолчанию настроен как часть шаблона проекта Visual Studio ASP.NET MVC на перенаправить привязки сборки, чтобы среда выполнения ориентировалась на самую последнюю версию сборки ASP.NET MVC. Вы можете исправить свой тестовый проект, добавив ту же информацию о привязке времени выполнения в его файл App.config:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Надеюсь, это поможет.

person Kevin Babcock    schedule 01.07.2013
comment
Большое спасибо... сам бы никогда не пришел к такому выводу. - person aponzani; 30.08.2013
comment
Этот ответ спас мой день! - person vcRobe; 31.03.2015