2

一部の ServiceStack サービスを単体テストしようとしています。サービスはキャッシュを使用します。依存関係を正常にモックし、MockRequestContext を使用してサービスを正常に呼び出すことができます。しかし、サービスが base.RequestContext.ToOptimizedResultUsingCache 内の DTO を返すと、以下の呼び出しから null 参照例外が発生します。

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 が保存されているときに null 参照例外が発生します

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;
                }
4

1 に答える 1