单元测试.NET REST服务?

时间:2011-11-15 21:11:52

标签: .net unit-testing rest

我在这里创建了一个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);
    }

}

继承自base(上下文包含的一些方法):

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 个答案:

答案 0 :(得分:3)

老实说,我不是这方面的专家 - 但在类似的情况下,我已经将接口传递给基类的构造函数,该基类处理讨厌的WebOperationContext函数,例如:

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

实际的WCF服务端点是一个微小的函数,它使用真正的WOContect实例化具体实例,该实际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服务都是在解耦类中执行函数。我测试那个班。