Я создал здесь решение REST, которое я сначала написал, потому что у меня возникают проблемы с тестированием сервиса REST.Это мой первый удар в службу отдыха, поэтому извиняюсь, если что-то серьезно оскорбительно.
В двух словах, у меня есть конкретный класс, обрабатывающий работу службы:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ESIID : BaseREST<ESI>
{
[OperationContract]
[WebGet(UriTemplate = "/{guid}/{id}", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
public Message LookupESIID(string guid, string id)
{
ResponseType = ResponseTypes.Json;
return GetById(guid, id);
}
private Message GetById(string guid, string id)
{
bllSvc = new Business.Services.TXESIIDRepository(guid);
var results = bllSvc.ByID(id);
return results.Count == 0 ? NoResults() : FormatResponse(results);
}
}
, который наследуется от базы (некоторые методы включены для контекста):
public abstract class BaseREST<T>
{
protected ResponseTypes ResponseType { get; set; }
public Message ReturnJson(string json)
{
var webContext = WebOperationContext.Current;
webContext.StatusCode = HttpStatusCode.OK;
return webContext.CreateJsonResponse(json);
}
public Message FormatResponse(List<T> results)
{
switch (ResponseType)
{
case ResponseTypes.Json:
return ReturnJson(JsonConvert.SerializeObject(results));
break;
case ResponseTypes.Xml:
return ReturnXml(results);
break;
default:
return ReturnErrorJson(new Error{ErrorDescription = "Format error", ErrorDetail = "Requested format is not valid", StatusCode = HttpStatusCode.BadRequest});
}
}
public Message NoResults()
{
var err = new Error
{
ErrorDescription = ConfigurationManager.AppSettings["NotFound_Descr"]
, ErrorDetail = ConfigurationManager.AppSettings["NotFound_Detail"]
, StatusCode = HttpStatusCode.BadRequest
};
return ReturnError(err);
}
}
Я не знаю, как правильно протестировать реализацию и базовый класс.Возможно ли (и, честно говоря, хорошо) создать какой-то тип поддельного HTTP-клиента в настройках теста, который бы затем устанавливал URI?Я не могу придумать, как сделать эти классы гибкими для модульных и интеграционных тестов.
Спасибо за любые указания по этому вопросу.