From c29aaac8de678403248cdc6e1acc7ac8c78e42b7 Mon Sep 17 00:00:00 2001 From: Simon Gockner Date: Tue, 4 Jun 2019 22:47:43 +0200 Subject: [PATCH] - add unit test --- LightweightIocContainer.sln | 8 +- .../InjectorContainerTest.cs | 189 ++++++++++++++++++ .../Test.LightweightIocContainer.csproj | 20 ++ 3 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 Test.LightweightIocContainer/InjectorContainerTest.cs create mode 100644 Test.LightweightIocContainer/Test.LightweightIocContainer.csproj diff --git a/LightweightIocContainer.sln b/LightweightIocContainer.sln index aca5db5..814541d 100644 --- a/LightweightIocContainer.sln +++ b/LightweightIocContainer.sln @@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28307.572 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightweightIocContainer", "LightweightIocContainer\LightweightIocContainer.csproj", "{17EDC847-0F69-462E-AD42-701BAEDF830F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LightweightIocContainer", "LightweightIocContainer\LightweightIocContainer.csproj", "{17EDC847-0F69-462E-AD42-701BAEDF830F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.LightweightIocContainer", "Test.LightweightIocContainer\Test.LightweightIocContainer.csproj", "{F9A8A01E-D080-4998-9135-D342B2C4B4CD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {17EDC847-0F69-462E-AD42-701BAEDF830F}.Debug|Any CPU.Build.0 = Debug|Any CPU {17EDC847-0F69-462E-AD42-701BAEDF830F}.Release|Any CPU.ActiveCfg = Release|Any CPU {17EDC847-0F69-462E-AD42-701BAEDF830F}.Release|Any CPU.Build.0 = Release|Any CPU + {F9A8A01E-D080-4998-9135-D342B2C4B4CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9A8A01E-D080-4998-9135-D342B2C4B4CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9A8A01E-D080-4998-9135-D342B2C4B4CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9A8A01E-D080-4998-9135-D342B2C4B4CD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Test.LightweightIocContainer/InjectorContainerTest.cs b/Test.LightweightIocContainer/InjectorContainerTest.cs new file mode 100644 index 0000000..1826951 --- /dev/null +++ b/Test.LightweightIocContainer/InjectorContainerTest.cs @@ -0,0 +1,189 @@ +using LightweightIocContainer; +using LightweightIocContainer.Exceptions; +using LightweightIocContainer.Interfaces; +using LightweightIocContainer.Registrations; +using Moq; +using NUnit.Framework; + +namespace Test.LightweightIocContainer +{ + [TestFixture] + public class InjectorContainerTest + { + #region TestClasses + //some of the test classes have to be public to allow the implementation of the factory + + public interface ITest + { + + } + + public interface ITestFactory + { + ITest Create(); + ITest Create(string name); + } + + private class Test : ITest + { + + } + + private class TestConstructor : ITest + { + public TestConstructor(string name, Test test) + { + + } + } + + #endregion + + + [Test] + public void TestInstall() + { + Mock installerMock = new Mock(); + + IInjectorContainer injectorContainer = new InjectorContainer(); + IInjectorContainer returnedContainer = injectorContainer.Install(installerMock.Object); + + installerMock.Verify(m => m.Install(It.IsAny()), Times.Once); + + Assert.AreEqual(injectorContainer, returnedContainer); + } + + [Test] + public void TestInstallMultiple() + { + Mock installer1Mock = new Mock(); + Mock installer2Mock = new Mock(); + Mock installer3Mock = new Mock(); + + IInjectorContainer injectorContainer = new InjectorContainer(); + IInjectorContainer returnedContainer = injectorContainer.Install(installer1Mock.Object, installer2Mock.Object, installer3Mock.Object); + + installer1Mock.Verify(m => m.Install(It.IsAny()), Times.Once); + installer2Mock.Verify(m => m.Install(It.IsAny()), Times.Once); + installer3Mock.Verify(m => m.Install(It.IsAny()), Times.Once); + + Assert.AreEqual(injectorContainer, returnedContainer); + } + + [Test] + public void TestResolveNotRegistered() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + + Assert.Throws(() => injectorContainer.Resolve()); + } + + [Test] + public void TestResolve() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + + ITest resolvedTest = injectorContainer.Resolve(); + + Assert.IsInstanceOf(resolvedTest); + } + + [Test] + public void TestResolveWithParams() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + + ITest resolvedTest = injectorContainer.Resolve("Test", new Test()); + + Assert.IsInstanceOf(resolvedTest); + } + + [Test] + public void TestResolveWithMissingParam() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + injectorContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests + + ITest resolvedTest = injectorContainer.Resolve("Test"); + + Assert.IsInstanceOf(resolvedTest); + } + + [Test] + public void TestResolveReflection() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + + object resolvedTest = injectorContainer.Resolve(typeof(ITest), null); + + Assert.IsInstanceOf(resolvedTest); + } + + [Test] + public void TestResolveSingleton() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register(Lifestyle.Singleton)); + + ITest resolvedTest = injectorContainer.Resolve(); + ITest secondResolvedTest = injectorContainer.Resolve(); + + Assert.AreEqual(resolvedTest, secondResolvedTest); + } + + [Test] + public void TestResolveTransient() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + + ITest resolvedTest = injectorContainer.Resolve(); + ITest secondResolvedTest = injectorContainer.Resolve(); + + Assert.AreNotEqual(resolvedTest, secondResolvedTest); + } + + [Test] + public void TestResolveFactory() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); + + ITestFactory testFactory = injectorContainer.Resolve(); + + Assert.IsInstanceOf(testFactory); + } + + [Test] + public void TestResolveFromFactory() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); + + ITestFactory testFactory = injectorContainer.Resolve(); + ITest createdTest = testFactory.Create(); + + Assert.IsInstanceOf(createdTest); + } + + [Test] + public void TestResolveFromFactoryWithParams() + { + IInjectorContainer injectorContainer = new InjectorContainer(); + injectorContainer.Register(RegistrationFactory.Register()); + injectorContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests + injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); + + ITestFactory testFactory = injectorContainer.Resolve(); + ITest createdTest = testFactory.Create("Test"); + + Assert.IsInstanceOf(createdTest); + } + } +} \ No newline at end of file diff --git a/Test.LightweightIocContainer/Test.LightweightIocContainer.csproj b/Test.LightweightIocContainer/Test.LightweightIocContainer.csproj new file mode 100644 index 0000000..a7be761 --- /dev/null +++ b/Test.LightweightIocContainer/Test.LightweightIocContainer.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp2.1 + + false + + + + + + + + + + + + + + \ No newline at end of file