/test/System.Web.Http.Test/Services/DependencyResolverTests.cs

https://bitbucket.org/mdavid/aspnetwebstack · C# · 219 lines · 150 code · 40 blank · 29 comment · 0 complexity · f0d66a0975297d5c023c17a9ab0139a3 MD5 · raw file

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Web.Http.Controllers;
  4. using Microsoft.TestCommon;
  5. using Moq;
  6. using Xunit;
  7. using Assert = Microsoft.TestCommon.AssertEx;
  8. namespace System.Web.Http.Services
  9. {
  10. public class DependencyResolverTests
  11. {
  12. // TODO: Add tests for SetService and GetCachedService
  13. [Fact]
  14. public void TypeIsCorrect()
  15. {
  16. Assert.Type.HasProperties<DependencyResolver>(TypeAssert.TypeProperties.IsPublicVisibleClass);
  17. }
  18. [Fact]
  19. public void ConstructorThrowsOnNullConfig()
  20. {
  21. Assert.ThrowsArgumentNull(() => new DependencyResolver(null), "configuration");
  22. Assert.ThrowsArgumentNull(() => new DependencyResolver(null, null), "configuration");
  23. }
  24. [Fact]
  25. public void ConstructorWithUserNullDependencyResolver()
  26. {
  27. // Arrange
  28. HttpConfiguration config = new HttpConfiguration();
  29. DependencyResolver resolver = new DependencyResolver(config, null);
  30. // Act
  31. object service = resolver.GetService(typeof(IHttpActionSelector));
  32. // Assert
  33. Assert.Null(service);
  34. }
  35. [Fact]
  36. public void ConstructorWithUserDependencyResolver()
  37. {
  38. // Arrange
  39. HttpConfiguration config = new HttpConfiguration();
  40. Mock<IDependencyResolver> userResolverMock = new Mock<IDependencyResolver>();
  41. IHttpActionSelector actionSelector = new Mock<IHttpActionSelector>().Object;
  42. userResolverMock.Setup(ur => ur.GetService(typeof(IHttpActionSelector))).Returns(actionSelector).Verifiable();
  43. DependencyResolver resolver = new DependencyResolver(config, userResolverMock.Object);
  44. // Act
  45. object service = resolver.GetService(typeof(IHttpActionSelector));
  46. // Assert
  47. userResolverMock.Verify();
  48. Assert.Same(actionSelector, service);
  49. }
  50. [Fact]
  51. public void GetServiceThrowsOnNull()
  52. {
  53. // Arrange
  54. HttpConfiguration config = new HttpConfiguration();
  55. DependencyResolver resolver = new DependencyResolver(config, null);
  56. // Act
  57. Assert.ThrowsArgumentNull(() => resolver.GetService(null), "serviceType");
  58. }
  59. [Fact]
  60. public void GetServiceDoesntEagerlyCreate()
  61. {
  62. // Arrange
  63. HttpConfiguration config = new HttpConfiguration();
  64. DependencyResolver resolver = new DependencyResolver(config);
  65. // Act
  66. object result = resolver.GetService(typeof(SomeClass));
  67. // Assert
  68. // Service resolver should not have created an instance or arbitrary class.
  69. Assert.Null(result);
  70. }
  71. [Fact]
  72. public void GetServicesThrowsOnNull()
  73. {
  74. // Arrange
  75. HttpConfiguration config = new HttpConfiguration();
  76. DependencyResolver resolver = new DependencyResolver(config, null);
  77. // Act
  78. Assert.ThrowsArgumentNull(() => resolver.GetServices(null), "serviceType");
  79. }
  80. [Fact]
  81. public void GetServicesDoesntEagerlyCreate()
  82. {
  83. // Arrange
  84. HttpConfiguration config = new HttpConfiguration();
  85. DependencyResolver resolver = new DependencyResolver(config);
  86. // Act
  87. IEnumerable<object> result = resolver.GetServices(typeof(SomeClass));
  88. // Assert
  89. // Service resolver should not have created an instance or arbitrary class.
  90. Assert.Empty(result);
  91. }
  92. // Arbitrary test class that we can use with the service resolver
  93. internal class SomeClass
  94. {
  95. }
  96. [Fact]
  97. public void SetResolverIDependencyResolverThrowsOnNull()
  98. {
  99. HttpConfiguration config = new HttpConfiguration();
  100. DependencyResolver resolver = new DependencyResolver(config);
  101. Assert.ThrowsArgumentNull(() => resolver.SetResolver((IDependencyResolver)null), "resolver");
  102. }
  103. [Fact]
  104. public void SetResolverIDependencyResolver()
  105. {
  106. // Arrange
  107. HttpConfiguration config = new HttpConfiguration();
  108. DependencyResolver resolver = new DependencyResolver(config);
  109. Mock<IDependencyResolver> userResolverMock = new Mock<IDependencyResolver>();
  110. IHttpActionSelector actionSelector = new Mock<IHttpActionSelector>().Object;
  111. userResolverMock.Setup(ur => ur.GetService(typeof(IHttpActionSelector))).Returns(actionSelector).Verifiable();
  112. userResolverMock.Setup(ur => ur.GetServices(typeof(IHttpActionSelector))).Returns(new List<object> { actionSelector }).Verifiable();
  113. resolver.SetResolver(userResolverMock.Object);
  114. // Act
  115. object service = resolver.GetService(typeof(IHttpActionSelector));
  116. IEnumerable<object> services = resolver.GetServices(typeof(IHttpActionSelector));
  117. // Assert
  118. userResolverMock.Verify();
  119. Assert.Same(actionSelector, service);
  120. Assert.Same(actionSelector, services.ElementAt(0));
  121. }
  122. [Fact]
  123. public void SetResolverCommonServiceLocatorThrowsOnNull()
  124. {
  125. HttpConfiguration config = new HttpConfiguration();
  126. DependencyResolver resolver = new DependencyResolver(config);
  127. Assert.ThrowsArgumentNull(() => resolver.SetResolver((object)null), "commonServiceLocator");
  128. }
  129. [Fact]
  130. public void SetResolverCommonServiceLocator()
  131. {
  132. // Arrange
  133. HttpConfiguration config = new HttpConfiguration();
  134. DependencyResolver resolver = new DependencyResolver(config);
  135. Mock<CommonServiceLocatorSlim> userResolverMock = new Mock<CommonServiceLocatorSlim>();
  136. IHttpActionSelector actionSelector = new Mock<IHttpActionSelector>().Object;
  137. userResolverMock.Setup(ur => ur.GetInstance(typeof(IHttpActionSelector))).Returns(actionSelector).Verifiable();
  138. userResolverMock.Setup(ur => ur.GetAllInstances(typeof(IHttpActionSelector))).Returns(new List<object> { actionSelector }).Verifiable();
  139. resolver.SetResolver(userResolverMock.Object);
  140. // Act
  141. object service = resolver.GetService(typeof(IHttpActionSelector));
  142. IEnumerable<object> services = resolver.GetServices(typeof(IHttpActionSelector));
  143. // Assert
  144. userResolverMock.Verify();
  145. Assert.Same(actionSelector, service);
  146. Assert.Same(actionSelector, services.ElementAt(0));
  147. }
  148. public interface CommonServiceLocatorSlim
  149. {
  150. object GetInstance(Type serviceType);
  151. IEnumerable<object> GetAllInstances(Type serviceType);
  152. }
  153. [Fact]
  154. public void SetResolverFuncThrowsOnNull()
  155. {
  156. HttpConfiguration config = new HttpConfiguration();
  157. DependencyResolver resolver = new DependencyResolver(config);
  158. Assert.ThrowsArgumentNull(() => resolver.SetResolver(null, _ => null), "getService");
  159. Assert.ThrowsArgumentNull(() => resolver.SetResolver(_ => null, null), "getServices");
  160. }
  161. [Fact]
  162. public void SetResolverFunc()
  163. {
  164. // Arrange
  165. HttpConfiguration config = new HttpConfiguration();
  166. DependencyResolver resolver = new DependencyResolver(config);
  167. Mock<CommonServiceLocatorSlim> userResolverMock = new Mock<CommonServiceLocatorSlim>();
  168. IHttpActionSelector actionSelector = new Mock<IHttpActionSelector>().Object;
  169. resolver.SetResolver(_ => actionSelector, _ => new List<object> { actionSelector });
  170. // Act
  171. object service = resolver.GetService(typeof(IHttpActionSelector));
  172. IEnumerable<object> services = resolver.GetServices(typeof(IHttpActionSelector));
  173. // Assert
  174. userResolverMock.Verify();
  175. Assert.Same(actionSelector, service);
  176. Assert.Same(actionSelector, services.ElementAt(0));
  177. }
  178. }
  179. }