Ошибка является результатом следующей строки в вашем контроллере:
List<Property> Props = JsonConvert.DeserializeObject<List<Property>>(data.properties.ToString());
В этой строке вы сначала конвертируете свойства в строку, а затем пытаетесь десериализовать строку.Однако преобразование в строку - это не то же самое, что сериализация в JSON.Таким образом, вызов DeserializeObject
получает неверную строку и выдает ошибку.
В Web API вы можете определить модель данных, которые вы получаете, как классы, и инфраструктура будет обрабатывать десериализацию для вас.Таким образом, вы можете просто определить класс в вашем проекте, который включает в себя все необходимые свойства.По сути, вы можете переместить класс TestObject
из тестового проекта в проект Web API и реализовать действие следующим образом:
public IHttpActionResult BlahMethod([FromBody] TestObject data)
{
string id = data.id;
var Props = data.properties;
User existing = _context.MyClass.Where(x => x.Properties.Any(y => y.PropertyLabel == "app" && y.PropertyValue == id)).FirstOrDefault();
if (existing == null)
return NotFound();
return Ok(existing);
}
Измененное действие действительно определяет необходимые входные данные, используя TestObject в качестве параметра.Если вы вызываете действие с помощью JSON, платформа Web API преобразует его для вас перед вызовом действия.
В этом методе вы работаете непосредственно с данными и также возвращаете существующего пользователя в качестве объекта.Инфраструктура Web API принимает возвращаемый параметр и сериализует его, чтобы вызывающий мог понять формат (обычно в JSON).
Что касается вашего модульного теста, вы создаете образец TestObject
, как вы уже сделали, и устанавливаете свойства, как требуется в вашем тестовом примере.Вы вызываете действие напрямую с данными.