Я написал модульный тест, используя xUnit для тестирования метода в моем основном контроллере веб-API ASP.net.
public class RegistrationsControllerTest : ControllerTestBase<RegistrationsController>
{
RegistrationsController registrationsController;
public RegistrationsControllerTest()
{
registrationsController = new RegistrationsController(log, registrationRepository);
}
[Fact]
public void Add_InvalidObjectPassed_ReturnsBadRequest()
{
// Arrange
var postBackMissingItem = new RegistrationFilter()
{
Id = Guid.NewGuid().ToString(),
PostbackURI = "https://test.example.com",
FailureURI = "https://testfail.example.com"
};
postBackMissingItem.PostbackURI = null;
// Act
var badResponse = registrationsController.AddRegistration(postBackMissingItem);
// Assert
Assert.IsType<BadRequestObjectResult>(badResponse);
}
}
Я пытаюсь проверить ввод с помощью TryValidateModel
в методе моего контроллера.
public class RegistrationsController : ControllerBase
{
ILogger<RegistrationsController> log;
IRegistrationRepository registrationRepository;
public RegistrationsController(ILogger<RegistrationsController> log, IRegistrationRepository registrationRepository)
{
this.log = log;
this.registrationRepository = registrationRepository;
RegistrationsController regController = new RegistrationsController(this.log, this.registrationRepository);
regController.ControllerContext = new ControllerContext();
}
[HttpPost(Name = nameof(AddRegistration))]
public async Task<IActionResult> AddRegistration([FromBody] RegistrationFilter registrationRequest)
{
// Ensure Id=null for inserts
registrationRequest.Id = null;
// Validate request content
if (!TryValidateModel(registrationRequest))
{
var errorText = "BadRequest. ModelState invalid";
log.ErrorEx(tr => tr.SetObject(new { Registration = registrationRequest }, errorText));
return BadRequest(ModelState);
}
// Some code
}
}
Когда я отлаживаю модульный тест, он выдает ошибку в строке с TryValidateModel
.
Ошибка: Ссылка на объект не установлена для экземпляра объекта . Я сталкивался с подобными проблемами в переполнении стека, где они упоминают о насмешке TryValidateModel
, но я не хочу издеваться над ней.
В этом выпуске здесь Как мне выполнить модульные тестовые действия без Mocking, которые используют UpdateModel? , один парень упоминает о добавлении контекста контроллера по умолчанию в контроллер.
Я попробовал этот подход, но при выходе из режима отладки он выходит из режима отладки и выдает ошибку
Программа '[25720] dotnet.exe' вышла с кодом -1073741819 (0xc0000005) Нарушение прав доступа
Отображается в окне вывода.
В конструкторе метода контроллера я добавил строки ControllerContext, но режим отладки выходит с ошибкой, о которой я упоминал.
Я добавил это неправильно или не в том месте? Какие изменения необходимо выполнить, чтобы пройти мой модульный тест?