PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Ninject.Test/Integration/ConstructorSelectionTests.cs

https://github.com/wjkhappy14/ninject
C# | 290 lines | 234 code | 56 blank | 0 comment | 0 complexity | 11ab056a3569ebf90ea02029c61a78ea MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. namespace Ninject.Tests.Integration
  2. {
  3. using System;
  4. using System.Runtime.InteropServices;
  5. using FluentAssertions;
  6. using Ninject.Parameters;
  7. using Ninject.Tests.Fakes;
  8. using Ninject.Tests.Integration.StandardKernelTests;
  9. using Xunit;
  10. public class ConstructorSelectionTests
  11. {
  12. private readonly StandardKernel kernel;
  13. public ConstructorSelectionTests()
  14. {
  15. this.kernel = new StandardKernel();
  16. }
  17. public void Dispose()
  18. {
  19. this.kernel.Dispose();
  20. }
  21. [Fact]
  22. public void DefaultCtorIsUsedWhenNoBindingAreAvailable()
  23. {
  24. kernel.Bind<Barracks>().ToSelf();
  25. var barracks = kernel.Get<Barracks>();
  26. barracks.Should().NotBeNull();
  27. barracks.Warrior.Should().BeNull();
  28. barracks.Weapon.Should().BeNull();
  29. }
  30. [Fact]
  31. public void CtorIsUsedWhenParameterIsSupplied()
  32. {
  33. kernel.Bind<Barracks>().ToSelf();
  34. var constructorArgument = new ConstructorArgument("warrior", new Samurai(new Sword()));
  35. var barracks = kernel.Get<Barracks>(constructorArgument);
  36. barracks.Should().NotBeNull();
  37. barracks.Warrior.Should().NotBeNull();
  38. barracks.Warrior.Weapon.Should().NotBeNull();
  39. barracks.Weapon.Should().BeNull();
  40. }
  41. [Fact]
  42. public void FirstAvailableWithBindingAvailableIsUsed()
  43. {
  44. kernel.Bind<Barracks>().ToSelf();
  45. kernel.Bind<IWeapon>().To<Sword>();
  46. var barracks = kernel.Get<Barracks>();
  47. barracks.Should().NotBeNull();
  48. barracks.Warrior.Should().BeNull();
  49. barracks.Weapon.Should().NotBeNull();
  50. }
  51. [Fact]
  52. public void CtorWithMostDependenciesIsUsedWhenBindingsAreAvailable()
  53. {
  54. kernel.Bind<Barracks>().ToSelf();
  55. kernel.Bind<IWeapon>().To<Sword>();
  56. kernel.Bind<IWarrior>().To<Samurai>();
  57. var barracks = kernel.Get<Barracks>();
  58. barracks.Should().NotBeNull();
  59. barracks.Warrior.Should().NotBeNull();
  60. barracks.Warrior.Weapon.Should().NotBeNull();
  61. barracks.Weapon.Should().NotBeNull();
  62. }
  63. [Fact]
  64. public void CreationWillFailIfAllDepenciesAreMissingAndInjectAttributeIsApplied()
  65. {
  66. kernel.Bind<NinjaBarracks>().ToSelf();
  67. Assert.Throws<ActivationException>(() => kernel.Get<NinjaBarracks>());
  68. kernel.Bind<IWeapon>().To<Sword>();
  69. Assert.Throws<ActivationException>(() => kernel.Get<NinjaBarracks>());
  70. kernel.Unbind<IWeapon>();
  71. kernel.Bind<IWarrior>().To<Samurai>();
  72. Assert.Throws<ActivationException>(() => kernel.Get<NinjaBarracks>());
  73. kernel.Unbind<IWarrior>();
  74. }
  75. [Fact]
  76. public void SelectedCtorIsUsedIfDeclared()
  77. {
  78. kernel.Bind<Barracks>().ToConstructor(_ => new Barracks());
  79. kernel.Bind<IWeapon>().To<Sword>();
  80. kernel.Bind<IWarrior>().To<Samurai>();
  81. var barracks = kernel.Get<Barracks>();
  82. barracks.Should().NotBeNull();
  83. barracks.Warrior.Should().BeNull();
  84. barracks.Weapon.Should().BeNull();
  85. }
  86. [Fact]
  87. public void SelectedCtorIsUsedIfDeclaredWithInjectedArgument()
  88. {
  89. kernel.Bind<Barracks>().ToConstructor(ctorArg => new Barracks(ctorArg.Inject<IWarrior>()));
  90. kernel.Bind<IWeapon>().To<Sword>();
  91. kernel.Bind<IWarrior>().To<Samurai>();
  92. var barracks = kernel.Get<Barracks>();
  93. barracks.Should().NotBeNull();
  94. barracks.Warrior.Should().NotBeNull();
  95. barracks.Warrior.Should().BeOfType<Samurai>();
  96. barracks.Weapon.Should().BeNull();
  97. }
  98. [Fact]
  99. public void WhenDefaultValuesArePassedToConstrctorSelectionTheyAreUsed()
  100. {
  101. kernel.Bind<Barracks>().ToConstructor(ctorArg => new Barracks(new Ninja(new Sword()), ctorArg.Inject<IWeapon>()));
  102. kernel.Bind<IWeapon>().To<Sword>();
  103. kernel.Bind<IWarrior>().To<Samurai>();
  104. var barracks = kernel.Get<Barracks>();
  105. barracks.Should().NotBeNull();
  106. barracks.Warrior.Should().NotBeNull();
  107. barracks.Warrior.Should().BeOfType<Ninja>();
  108. barracks.Weapon.Should().NotBeNull();
  109. }
  110. [Fact]
  111. public void DefaultValuesAreEvaluatedForEachRequest()
  112. {
  113. kernel.Bind<Barracks>().ToConstructor(_ => new Barracks(new Ninja(new Sword())));
  114. var barracks1 = kernel.Get<Barracks>();
  115. var barracks2 = kernel.Get<Barracks>();
  116. barracks1.Warrior.Should().NotBeSameAs(barracks2.Warrior);
  117. }
  118. #if !WINDOWS_PHONE
  119. [Fact]
  120. public void ConstantsCanBePassedToToConstructor()
  121. {
  122. var ninja = new Ninja(new Sword());
  123. kernel.Bind<Barracks>().ToConstructor(_ => new Barracks(ninja));
  124. var barracks1 = kernel.Get<Barracks>();
  125. var barracks2 = kernel.Get<Barracks>();
  126. barracks1.Warrior.Should().BeSameAs(barracks2.Warrior);
  127. }
  128. #endif
  129. #if !SILVERLIGHT
  130. private static Ninja CreateNinja()
  131. #else
  132. public static Ninja CreateNinja()
  133. #endif
  134. {
  135. return new Ninja(new Sword());
  136. }
  137. [Fact]
  138. public void ResultsFromNonGenericMethodCallsCanBePassedToToConstructor()
  139. {
  140. kernel.Bind<Barracks>().ToConstructor(_ => new Barracks(CreateNinja()));
  141. var barracks1 = kernel.Get<Barracks>();
  142. var barracks2 = kernel.Get<Barracks>();
  143. barracks1.Warrior.Should().NotBeSameAs(barracks2.Warrior);
  144. }
  145. [Fact]
  146. public void WhenLazyValuesArePassedToConstrctorSelectionTheyAreEvaluatedAtResolve()
  147. {
  148. int activationCount = 0;
  149. kernel.Bind<Ninja>().ToSelf().Named("1").OnActivation(inst => activationCount++);
  150. kernel.Bind<Barracks>().ToConstructor(ctorArg => new Barracks(ctorArg.Context.Kernel.Get<Ninja>("1"), ctorArg.Inject<IWeapon>()));
  151. kernel.Bind<IWeapon>().To<Sword>();
  152. kernel.Bind<IWarrior>().To<Samurai>();
  153. activationCount.Should().Be(0);
  154. var barracks = kernel.Get<Barracks>();
  155. barracks.Should().NotBeNull();
  156. barracks.Warrior.Should().NotBeNull();
  157. barracks.Warrior.Should().BeOfType<Ninja>();
  158. barracks.Weapon.Should().NotBeNull();
  159. activationCount.Should().Be(1);
  160. }
  161. [Fact]
  162. public void WhenClassHasTwoConstructorsWithInjectAttributeThenAnActivationExceptionIsThrown()
  163. {
  164. kernel.Bind<ClassWithTwoInjectAttributes>().ToSelf();
  165. Action getClassWithTwoInjectAttributes = () => kernel.Get<ClassWithTwoInjectAttributes>();
  166. getClassWithTwoInjectAttributes.ShouldThrow<ActivationException>();
  167. }
  168. [Fact]
  169. public void WhenConstructorHasSelfBindableTypeItDoesNotCountAsServedParameter()
  170. {
  171. var instance = kernel.Get<ClassWithSelfBindableType>();
  172. instance.Sword.Should().BeNull();
  173. }
  174. [Fact]
  175. public void WhenConstructorHasAnOpenGenericTypeItCountsAsServedParameterIfBindingExists()
  176. {
  177. kernel.Bind(typeof(IGeneric<>)).To(typeof(GenericService<>));
  178. var instance = kernel.Get<ClassWithGeneric>();
  179. instance.Generic.Should().NotBeNull();
  180. }
  181. #if !SILVERLIGHT
  182. [Fact]
  183. public void WhenConstructorHasAValueWithDefaultValueItCountsAsServedParameter()
  184. {
  185. var instance = kernel.Get<ClassWithDefaultValue>();
  186. instance.X.Should().NotBe(0);
  187. }
  188. public class ClassWithDefaultValue
  189. {
  190. public ClassWithDefaultValue()
  191. {
  192. }
  193. public ClassWithDefaultValue([DefaultParameterValue(3)] int x)
  194. {
  195. this.X = x;
  196. }
  197. public int X { get; set; }
  198. }
  199. #endif
  200. public class ClassWithGeneric
  201. {
  202. public ClassWithGeneric()
  203. {
  204. }
  205. public ClassWithGeneric(IGeneric<int> generic)
  206. {
  207. this.Generic = generic;
  208. }
  209. public IGeneric<int> Generic { get; set; }
  210. }
  211. public class ClassWithSelfBindableType
  212. {
  213. public ClassWithSelfBindableType()
  214. {
  215. }
  216. public ClassWithSelfBindableType(Sword sword)
  217. {
  218. this.Sword = sword;
  219. }
  220. public Sword Sword { get; set; }
  221. }
  222. public class ClassWithTwoInjectAttributes
  223. {
  224. [Inject]
  225. public ClassWithTwoInjectAttributes()
  226. {
  227. }
  228. [Inject]
  229. public ClassWithTwoInjectAttributes(int someValue)
  230. {
  231. }
  232. }
  233. }
  234. }