Почему приведение результата от контроллера в модульном тесте возвращает ноль? - PullRequest
0 голосов
/ 27 мая 2019

Я нахожусь в процессе оснащения моих источников юнит-тестами, но здесь я допустил ошибку.Что я могу сделать на этом этапе, если значение действительно «ноль»?Это вообще возможно?

Я пытался выяснить, как другие решают эту проблему, но со следующей веткой я не совсем ладил. C # в моем модульном тесте я хочу увидеть, является ли он пустым или пустой строкой

-> Если я использую IsNullOrEmpty (), как в примере выше, как это выглядит вмой фрагмент кода?

Это уязвимая область в моем модульном тесте:

Assert.That(deviceInfo.SerialNumber == null);

Появляется следующее сообщение об ошибке:

Сообщение: System.ArgumentNullException:Значение не может быть нулевым.Имя параметра: source

Edit - это то, на что похожа моя среда:

Вот класс с объектом DeviceDetails, который имеет всю информацию в теле.

public virtual IActionResult DevicesIdGet([FromRoute][Required]string id)
{
    var device = _deviceManager.GetDevice(id);

    if (device == null)
        return NotFound();

    var deviceDetails = new DeviceDetails
    {
        IsOnline = device.IsOnline(),
        SerialNumber = null
    };

    return Ok(deviceDetails);
}

Юнит-тест

 private Device _testDevice;

 [SetUp]
 public void SetUp()
    {
        _testDevice = new Device
        {
            Id = 1,
            DeviceType = 1,
            DisplayName = "TestDevice",
            IpAddress = IPAddress.Parse("127.0.0.1"),
            IpAddressString = "127.0.0.1"
        };
    }

[Test]
public void If_DeviceIsAvailable_Then_DeviceIdIsSelected()
{
    // ARRANGE
    var deviceManagerMock = new Mock<IDeviceManager>();
    deviceManagerMock.Setup(manager => manager.GetDevices(false))
        .Returns(new List<Device>
                 {
                     _testDevice
                 })
        .Verifiable();

    var subject = new DevicesApiController(deviceManagerMock.Object);

    // ACT
    var result = subject.DevicesIdGet("1");

    // ASSERT
    var deviceInfos = result as IEnumerable<DeviceDetails>;
    var deviceInfo = deviceInfos.Single();
    Assert.That(deviceInfo.IsOnline == true);
    Assert.That(deviceInfo.SerialNumber == null);
}

Ответы [ 3 ]

3 голосов
/ 27 мая 2019

Контроллер вызывает этот метод IDeviceManager, который не является поддельным :

var device = _deviceManager.GetDevice(id);

Отсутствие насмешливости в том, что метод является одной из причин исключения.Но если вы исправите это и смоделируете этот метод (используя Setup, чтобы указать результат на макете), вы все равно получите то же исключение.Подробнее об этом позже.Во-первых, вот путь, по которому идет ваш код:

Поскольку он не является ложным, возвращаемое значение при вызове GetDevice на макете будет нулевым, поэтому это происходит:

if (device == null)
    return NotFound();

Результатом метода является NotFound результат.

Затем, это происходит в модульном тесте:

var deviceInfos = result as IEnumerable<DeviceDetails>;
var deviceInfo = deviceInfos.Single();

result - это NotFoundResult.result as IEnumerable<DeviceDetails> возвращает null.

Итак, вы фактически делаете это:

IEnumerable<DeviceDetails> deviceInfos = null;
var deviceInfo = deviceInfos.Single();

Параметр source, переданный методу Single, имеет значение null, следовательно, это исключение.


Если вы поиграете GetDevice, вы все равно получите ту же ошибку почти по той же причине.Теперь ваш код вернет OkObjectResult вместо NotFoundResult.Вы попытаетесь привести его к IEnumerable<DeviceDetails>, оно все равно будет null, и вы получите то же исключение.

Вам нужно получить значение из OkObjectResult, напримерэто:

var actionResult = subject.DevicesIdGet("1") as OkObjectResult;
var deviceInfos = actionResult.Value as IEnumerable<DeviceDetails> ;
var deviceInfo = deviceInfos.Single();
0 голосов
/ 27 мая 2019

Вы должны вызвать исключение, когда у вас есть нулевое значение.

Если вы уже это сделали, это еще одна строка, которая выдает эту ошибку.

0 голосов
/ 27 мая 2019

На основании опубликованного кода кажется, что deviceInfo может иметь значение null.Вы можете сделать следующее:

 if (deviceInfo == null)
      throw new ArgumentNullException(“source”);

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