Модульный тест .NET REST Service? - PullRequest
1 голос
/ 16 ноября 2011

Я создал здесь решение 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?Я не могу придумать, как сделать эти классы гибкими для модульных и интеграционных тестов.

Спасибо за любые указания по этому вопросу.

1 Ответ

3 голосов
/ 16 ноября 2011

Если честно, я не эксперт в этом - но в аналогичной ситуации я передал интерфейс в конструктор для базового класса, который обрабатывает надоедливые функции WebOperationContext, например:

public interface IWebOperationContextWrapper
{
    HttpStatusCode OutgoingStatusCode { get; set; }
    string OutgoingStatusDescription { get; set; }
}

Фактическая конечная точка службы WCF, представляющая собой крошечную функцию, которая создает конкретный экземпляр с реальным WOContect, который передается функции, которая фактически выполняет работу, например:

    //wcf endpoint
    public SomeResponseDto SomeWebMethod(string id)
    {            
        WebOperationContextWrapper webOperationContext = new WebOperationContextWrapper();
        return ThisIsATestableFunctionThatCanBePassedAFakeContext(Id, webOperationContext);
    }

Если я хочу проверить функцию,вызовы конечной точки теперь я могу:

IWebOperationContextWrapper webOperationContext = MockRepository.GenerateStub<IWebOperationContextWrapper>();

        var result = svc.ThisIsATestableFunctionThatCanBePassedAFakeContext(Id, webOperationContext);

        Assert.IsWhatever(result);

На самом деле я не проверяю службу WCF, потому что все, что делает служба WCF, - это выполняет функции в разъединенном классе.Я проверяю этот класс.

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