我想使我的ServiceStack服务可测试。
目前我有:
[RequireFormsAuthentication]
public object Delete(DeleteRequest request)
{
var originalRequest = (HttpRequest)Request.OriginalRequest;
var identity = originalRequest.RequestContext.HttpContext.User.Identity;
return othercode(identity);
}
RequireFormsAuthentication在哪里
public class RequireFormsAuthenticationAttribute : RequestFilterAttribute
{
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
var originalRequest = (HttpRequest)req.OriginalRequest;
var identity = originalRequest.RequestContext.HttpContext.User.Identity;
if (!identity.IsAuthenticated)
{
res.StatusCode = (int)HttpStatusCode.Forbidden;
res.EndServiceStackRequest(skipHeaders: true);
}
}
}
我已经模拟掉了'othercode()'使用的所有依赖关系,剩下的只是基类Service中的内容。是否有一种模式/策略/方法/我缺少的东西使这变得微不足道?
最佳答案
很抱歉没有使用moq ...已经使用RhinoMocks完成了其中的一些操作。我认为这个概念应该转移到起订量。 This和this一样可能是一个很好的资源。
无论如何,我认为下面的测试代码应该可以帮助您入门。您对Request.OriginalRequest
的 mock 是将Service.RequestContext
替换为模拟对象。然后,您只需要 mock 除此之外的所有内容。这将是很多“ mock ”,如果您每次 mock 一个类时都对自己重复“您在 mock 我”,那几乎是一件令人愉快的事情。
[Test]
public void testsomethign()
{
var mockedRequestContext = MockRepository.GenerateMock<IRequestContext>();
var mockedHttpRequest = MockRepository.GenerateMock<IHttpRequest>();
var mockedOriginalRequest = MockRepository.GenerateMock<HttpRequestBase>();
var mockedOriginalRequestContext = MockRepository.GenerateMock<RequestContext>();
mockedOriginalRequest.Stub(x => x.RequestContext).Return(mockedOriginalRequestContext);
mockedHttpRequest.Stub(x => x.OriginalRequest).Return(mockedOriginalRequest);
mockedRequestContext.Stub(x => x.Get<IHttpRequest>()).Return(mockedHttpRequest);
var service = new ServiceTests()
{
RequestContext = mockedRequestContext
};
service.Delete(new DeleteRequest());
}
关于c# - 在ServiceStack中可以模拟Request.OriginalRequest对象进行单元测试吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16218440/