Xunit test SerializableError возвращает значение объекта - PullRequest
1 голос
/ 29 сентября 2019

Я пишу модульные тесты логики контроллера с Xunit.

Одно из моих действий контроллера возвращает BadRequestObjectResult с объектом ModelStateDictionary:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

Для этого мойВ тестовом примере добавляется ошибка ModelState, например:

controller.ModelState.AddModelError("Test", "This is a test model error");

В инструкциях Assert моего теста я проверяю возвращаемый объект типа SerializableError:

var returnError = Assert.IsType<SerializableError>(objectResult.Value);
Assert.Single(returnError);
Assert.True(returnError.ContainsKey("Test"));
Assert.True(returnError.ContainsValue("This is a test model error"));

The Assert.Single(returnError); и Assert.True(returnError.ContainsKey("Test")); проверки пройдены успешно, как и ожидалось.

Однако проверка значения ошибки не удалась (возвращается false, но я ожидаю, что она вернет true):

Assert.True(returnError.ContainsValue("This is a test model error"));

Из отладки видно, что значение, похоже, вложено в дополнительный string объект:

enter image description here

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

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Как уже упоминалось в другом ответе, значение Dictionary - это массив, поэтому вы должны указать это в утверждениях.

var returnError = Assert.IsType<SerializableError>(objectResult.Value);

var errors = objectResult.Value as SerializableError;
Assert.Single(errors);
Assert.True(errors.ContainsKey("Test"));

var errorValues = returnError["Test"] as string[];
Assert.Single(errorValues);
Assert.True(errorValues.Single() == "This is a test model error");

Поскольку SerializableError наследуется от Dictionary, вы должны иметь возможность сделать это вболее понятный способ с помощью библиотеки FluentAssertions

var expected = new SerializableError
{
    { "Test", new[] {"This is a test model error"}},
};

objectResult.Value.Should().BeOfType<SerializableError>();
objectResult.Value.Should().BeEquivalentTo(expected);
1 голос
/ 29 сентября 2019

Ваша ценность - список.поэтому Value [0] или Value.First ().Это ключевая пара, поэтому вы должны иметь доступ к нему с помощью returnError [keyName].

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