2013-09-26 4 views
2

Я пытаюсь выполнить тестирование некоторых сервисов ServiceStack. Сервисы используют кеширование. Я могу успешно издеваться над моими зависимостями и, используя MockRequestContext, очень просто называть мои службы. Но когда мои услуги возвращает это DTO внутри base.RequestContext.ToOptimizedResultUsingCache, я получаю пустую ссылку исключение из приведенного ниже вызова:Исключение блока тестирования ServiceStack Cache Exception

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; 
       } 
+0

У вас есть это в runnable/stand-alone gist? – mythz

+0

Я не уверен, могу ли я поместить его вместе, но я попробую. –

+0

Также оптимизированный кешированный ответ использует ContentTypeFilters ServiceStack AppHost, поэтому вам может потребоваться инициализировать AppHost, вы можете попробовать «var appHost = new BasicAppHost(). Init();' в вашем TestFixtureSetup, также, вероятно, лучше всего использовать тот же контейнер, например 'var container = appHost.Container;'. – mythz

ответ

1

Per mythz предложение в комментариях, я добавляю ed хост приложения и использовал его контейнер, и тест работал. Ниже приведен обновленный тест.

[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 
    } 
Смежные вопросы