c# - 单元测试ServiceStack缓存异常

标签 c# unit-testing caching servicestack

我正在尝试对某些 ServiceStack 服务进行单元测试。这些服务使用缓存。我可以成功地模拟我的依赖项,并使用 MockRequestContext 调用我的服务就好了。但是当我的服务返回 base.RequestContext.ToOptimizedResultUsingCache 中的 DTO 时,我从下面的调用中得到一个空引用异常:

ServiceStack.CacheAccess.Providers.CacheClientExtensions.Cache(ICacheClient cacheClient, String cacheKey, Object responseDto, IRequestContext context, Nullable`1 expireCacheIn)

我的测试设置如下

[TestMethod]
    public void GetAgencyCase_Returns_AgencyCaseDetailsResponse()
    {
        Container container = new Container();

        Mock<IChangeRequestService> changeRequestService = new Mock<IChangeRequestService>();
        Mock<IRequestService> requestService = new Mock<IRequestService>();

        //Build the case we want returned
        Case testCase = Builder<Case>.CreateNew()
            .With(x => x.CaseId = "123")
            .And(x => x.CaseNumber = "456")
            .With(x => x.Agencies = Builder<CasesAgency>.CreateListOfSize(1)
                .All()
                .With(m => m.Agency = Builder<Agency>.CreateNew().With(z => z.AgencyId = 2).And(z => z.AgencyName = "Test").Build())
                .Build())
            .With(x => x.Requests = Builder<Request>.CreateListOfSize(5)
                .Build())
                .Build();

        requestService.Setup<Case>(x => x.GetCase(It.IsAny<CaseSearchCriteria>(), It.IsAny<AuthenticatedUser>()))
            .Returns(testCase);

        container.Register<IChangeRequestService>(changeRequestService.Object);
        container.Register<IRequestService>(requestService.Object);

        container.Register<ILog>(new Mock<ILog>().Object);
        container.Register<ICacheClient>(new MemoryCacheClient());
        container.RegisterAutoWired<AgencyCaseService>();

        var service = container.Resolve<AgencyCaseService>();
        service.SetResolver(new BasicResolver(container));

        var context = new MockRequestContext() { ResponseContentType = ContentType.Json };
        context.CreateAppHost();

        service.RequestContext = context;


        var response = service.Get(new GetAgencyCase { AgencyId = 2, AgencyCaseNumber = "123" });
        ...assert stuff 
    }

当我调用我的服务方法时一切看起来都很好,但是当 dto 被保存到这里看到的缓存时我得到了空引用异常

try
        {
            var cacheKey = UrnId.Create<GetAgencyCase>(
                request.AgencyId.ToString() +
                request.AgencyCaseNumber);

            var cacheExpireTime = TimeSpan.FromMinutes(_cacheDuration);

            return base.RequestContext.ToOptimizedResultUsingCache<AgencyCaseDetailsResponse>(base.Cache, cacheKey, cacheExpireTime, () =>
                { ...business logic
                  return agencyCaseDto;
                }

最佳答案

根据评论中的 mythz 建议,我添加了一个应用程序主机并使用了它的容器,测试成功了。以下是更新后的测试。

[TestMethod]
    public void GetAgencyCase_Returns_AgencyCaseDetailsResponse()
    {
        var appHost = new BasicAppHost().Init();//this is needed for caching
        Container container = appHost.Container;

        Mock<IChangeRequestService> changeRequestService = new Mock<IChangeRequestService>();
        Mock<IRequestService> requestService = new Mock<IRequestService>();

        //Build the case we want returned
        Case testCase = Builder<Case>.CreateNew()
            .With(x => x.CaseId = "123")
            .And(x => x.CaseNumber = "456")
            .With(x => x.Agencies = Builder<CasesAgency>.CreateListOfSize(1)
                .All()
                .With(m => m.Agency = Builder<Agency>.CreateNew().With(z => z.AgencyId = 2).And(z => z.AgencyName = "Test").Build())
                .Build())
            .With(x => x.Requests = Builder<Request>.CreateListOfSize(5)
                .Build())
                .Build();

        requestService.Setup<Case>(x => x.GetCase(It.IsAny<CaseSearchCriteria>(), It.IsAny<AuthenticatedUser>()))
            .Returns(testCase);

        container.Register<IChangeRequestService>(changeRequestService.Object);
        container.Register<IRequestService>(requestService.Object);

        container.Register<ILog>(new Mock<ILog>().Object);
        container.Register<ICacheClient>(new MemoryCacheClient());
        container.RegisterAutoWired<AgencyCaseService>();

        var service = container.Resolve<AgencyCaseService>();
        service.SetResolver(new BasicResolver(container));

        var context = new MockRequestContext() { ResponseContentType = ContentType.Json };

        service.RequestContext = context;


        var response = service.Get(new GetAgencyCase { AgencyId = 2, AgencyCaseNumber = "123" });
        ...assert stuff
    }

关于c# - 单元测试ServiceStack缓存异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19021130/

相关文章:

java - Spring @cacheable 如何在凌晨 12 点刷新缓存?

javascript - 在使用javascript加载页面之前从数组中缓存动态图像

c# - 有没有办法知道请求是使用 ASP.NET MVC 中的 Redirect() 方法发出的

c# - 使用最大化窗口时如何更改标签的位置

c# - 检查 WeakReference 目标引用计数

java - 具有本地内部类的 JUnit 4 测试方法在测试用例之间不一致

c# - 如何在 C# 中使用 linq 修改列表的某些元素?

java - Ploeh 的 AutoFixture for .Net 是否有 Java 替代品?

java.lang.NoSuchMethodError : 'void org.springframework.util.Assert.state(boolean, java.util.function.Supplier)' 错误

apache - 了解 Firefox 开发者控制台(网络选项卡)中用于图像缓存控制的 "Response Headers"和 "Request Headers"之间的区别