Контроллер вызывает этот метод 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();