1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Linq;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class MultiServiceResolverTest
{
[Fact]
public void ConstructorWithNullThunkArgumentThrows()
{
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { new MultiServiceResolver<TestProvider>(null); },
"itemsThunk");
}
[Fact]
public void CurrentPrependsFromResolver()
{
// Arrange
IEnumerable<TestProvider> providersFromServiceLocation = GetProvidersFromService();
IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
IEnumerable<TestProvider> expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk);
Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
resolver.Setup(r => r.GetServices(typeof(TestProvider)))
.Returns(providersFromServiceLocation);
MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);
// Act
IEnumerable<TestProvider> returnedProviders = multiResolver.Current;
// Assert
Assert.Equal(expectedProviders.ToList(), returnedProviders.ToList());
}
[Fact]
public void CurrentCachesResolverResult()
{
// Arrange
IEnumerable<TestProvider> providersFromServiceLocation = GetProvidersFromService();
IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
IEnumerable<TestProvider> expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk);
Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
resolver.Setup(r => r.GetServices(typeof(TestProvider)))
.Returns(providersFromServiceLocation);
MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);
// Act
IEnumerable<TestProvider> returnedProviders = multiResolver.Current;
IEnumerable<TestProvider> cachedProviders = multiResolver.Current;
// Assert
Assert.Equal(expectedProviders.ToList(), returnedProviders.ToList());
Assert.Equal(expectedProviders.ToList(), cachedProviders.ToList());
resolver.Verify(r => r.GetServices(typeof(TestProvider)), Times.Exactly(1));
}
[Fact]
public void CurrentReturnsCurrentItemsWhenResolverReturnsNoInstances()
{
// Arrange
IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
MultiServiceResolver<TestProvider> resolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk);
// Act
IEnumerable<TestProvider> returnedProviders = resolver.Current;
// Assert
Assert.Equal(providersFromItemsThunk.ToList(), returnedProviders.ToList());
}
[Fact]
public void CurrentDoesNotQueryResolverAfterNoInstancesAreReturned()
{
// Arrange
IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
resolver.Setup(r => r.GetServices(typeof(TestProvider)))
.Returns(new TestProvider[0]);
MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);
// Act
IEnumerable<TestProvider> returnedProviders = multiResolver.Current;
IEnumerable<TestProvider> cachedProviders = multiResolver.Current;
// Assert
Assert.Equal(providersFromItemsThunk.ToList(), returnedProviders.ToList());
Assert.Equal(providersFromItemsThunk.ToList(), cachedProviders.ToList());
resolver.Verify(r => r.GetServices(typeof(TestProvider)), Times.Exactly(1));
}
[Fact]
public void CurrentPropagatesExceptionWhenResolverThrowsNonActivationException()
{
// Arrange
Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>(MockBehavior.Strict);
MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => null, resolver.Object);
// Act & Assert
Assert.Throws<MockException>(
() => multiResolver.Current,
@"IDependencyResolver.GetServices(System.Web.Mvc.Test.MultiServiceResolverTest+TestProvider) invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup."
);
}
private class TestProvider
{
}
private IEnumerable<TestProvider> GetProvidersFromService()
{
return new TestProvider[]
{
new TestProvider(),
new TestProvider()
};
}
private IEnumerable<TestProvider> GetProvidersFromItemsThunk()
{
return new TestProvider[]
{
new TestProvider(),
new TestProvider()
};
}
}
}
|