我想使我的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完成了其中的一些操作。我认为这个概念应该转移到起订量。 Thisthis一样可能是一个很好的资源。

无论如何,我认为下面的测试代码应该可以帮助您入门。您对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/

10-16 19:23