Я столкнулся с той же проблемой и закончил тем, что написал свои тесты как интеграционные тесты на гораздо более высоком уровне, фактически делая реальные вызовы REST / HTTP через простой клиент HttpWebRequest. Это позволило мне проверить заголовки HTTP-ответов / коды состояния и дважды проверить сериализацию JSON / XML с точки зрения клиента, что было столь же важно, как и то, успешно ли выполнялись операции.
Я начал с того, что возвратил OperationResult из всех моих обработчиков и использовал их для обёртывания строго типизированных объектов. Все мои обработчики наследуются от базового класса с несколькими вспомогательными методами, которые облегчают возвращение пользовательской ошибки с удобным сообщением об ошибке. Чем больше я это кодировал, тем больше мои обработчики напоминали контроллер ASP.NET MVC. e.g.:
public OperationResult GetById(int id)
{
try
{
// do stuff here
return OKResult( // some strongly-typed resource );
}
catch(SomeException ex)
{
return BadRequestResult(SomeErrorCode, ex.Message);
}
}
Тогда в тестовом клиенте довольно просто проверить код состояния HTTP. Очевидно, это не очень помогает с насмешками. Я не уверен, что является лучшим решением, на самом деле я одобрил этот вопрос в надежде, что кто-то ответит на него лучше, чем я, - но до сих пор мне это удавалось.