Итак, я создал модульные тесты для ApiController, и один из них дает сбой только на сервере в конвейере CI с исключением System.InvalidOperationException : HttpControllerContext.Configuration must not be null.
Структура выглядит следующим образом:
public IHttpActionResult MyControllerMethod()
{
if(this.SomeThings()) // uses this.IService and this.IService2
return this.UnAuthorized();
DoOtherStuff();
return this.Ok();
}
В моем тесте я имитирую IService и IService2 и передаю их контроллеру:
var controllerUnderTest = new MyController(serviceMock, serviceMock2);
Затем я вызываю метод с некоторыми неверными данными, провоцируя возврат UnAuthorized()
:
var result = await controllerUnderTest.MyControllerMethod(invalidData).ExecuteAsync(CancellationToken.None);`
Сначала это не удалось. Поэтому я добавил
controllerUnderTest.Configuration = new HttpConfiguration();
controllerUnderTest.Request = new HttpRequestMessage();
из этого сообщения Stackoverflow.
Итак, теперь это работает. Локально. Работает при отладке, работает с помощью testrunner от ReSharper, работает с NCrunch.
Но это не работает в конвейере.
При выполнении в конвейере с использованием консольного инструмента ncrunch тесты завершаются с ошибкой с указанным выше сообщением.
Есть идеи, как это исправить? Как config может быть нулевым, когда я его явно инициализирую?
Изменить: вот трассировка стека:
System.InvalidOperationException : HttpControllerContext.Configuration must not be null.
bei System.Web.Http.Results.ExceptionResult.ApiControllerDependencyProvider.EnsureResolved()
bei System.Web.Http.Results.ExceptionResult.ApiControllerDependencyProvider.get_IncludeErrorDetail()
bei System.Web.Http.Results.ExceptionResult.Execute()
bei System.Web.Http.Results.ExceptionResult.ExecuteAsync(CancellationToken cancellationToken)