Я пытаюсь выполнить тестирование некоторых сервисов 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;
}
У вас есть это в runnable/stand-alone gist? – mythz
Я не уверен, могу ли я поместить его вместе, но я попробую. –
Также оптимизированный кешированный ответ использует ContentTypeFilters ServiceStack AppHost, поэтому вам может потребоваться инициализировать AppHost, вы можете попробовать «var appHost = new BasicAppHost(). Init();' в вашем TestFixtureSetup, также, вероятно, лучше всего использовать тот же контейнер, например 'var container = appHost.Container;'. – mythz