Модульный тест завершается неудачно при попытке проверить входной объект в контроллере с помощью TryValidateModel - PullRequest
0 голосов
/ 22 июня 2019

Я написал модульный тест, используя 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, но режим отладки выходит с ошибкой, о которой я упоминал.

Я добавил это неправильно или не в том месте? Какие изменения необходимо выполнить, чтобы пройти мой модульный тест?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...