private static void VerifyServicesAreCached <T>( T service, CachingDependencyResolver cachingResolver, Mock <IDbDependencyResolver> mockResolver, string name) { mockResolver.Setup(m => m.GetServices(typeof(T), name)).Returns(new object[] { service }); Assert.Same(service, cachingResolver.GetServices <T>(name).Single()); mockResolver.Verify(m => m.GetServices(typeof(T), name), Times.Once()); Assert.Same(service, cachingResolver.GetServices <T>(name).Single()); mockResolver.Verify(m => m.GetServices(typeof(T), name), Times.Once()); // Underlying resolver not called again }
public void A_service_that_resolves_to_null_is_still_cached() { var mockResolver = new Mock <IDbDependencyResolver>(); mockResolver.Setup(m => m.GetServices(typeof(IPilkington), null)).Returns(Enumerable.Empty <object>()); var cachingResolver = new CachingDependencyResolver(mockResolver.Object); Assert.Empty(cachingResolver.GetServices <IPilkington>()); mockResolver.Verify(m => m.GetServices(typeof(IPilkington), null), Times.Once()); Assert.Empty(cachingResolver.GetServices <IPilkington>()); mockResolver.Verify(m => m.GetServices(typeof(IPilkington), null), Times.Once()); // Underlying resolver not called again }
public void GetServices_can_be_accessed_from_multiple_threads_concurrently() { for (var i = 0; i < 30; i++) { var bag = new ConcurrentBag <IPilkington>(); var karl = new Mock <IPilkington>().Object; var resolver = new CachingDependencyResolver(new SingletonDependencyResolver <IPilkington>(karl)); ExecuteInParallel(() => bag.Add(resolver.GetServices <IPilkington>().Single())); Assert.Equal(20, bag.Count); Assert.True(bag.All(c => karl == c)); } }