我在这里创建了一个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?我想不出如何使这些类灵活用于单元和集成测试。
感谢您的任何指示。
答案 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服务都是在解耦类中执行函数。我测试那个班。