#6: start refactoring `Injector` to Ioc
parent
a805731d13
commit
77e158f564
11 changed files with 223 additions and 223 deletions
@ -1,189 +0,0 @@ |
||||
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<IInjectorInstaller> installerMock = new Mock<IInjectorInstaller>(); |
||||
|
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
IInjectorContainer returnedContainer = injectorContainer.Install(installerMock.Object); |
||||
|
||||
installerMock.Verify(m => m.Install(It.IsAny<IInjectorContainer>()), Times.Once); |
||||
|
||||
Assert.AreEqual(injectorContainer, returnedContainer); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestInstallMultiple() |
||||
{ |
||||
Mock<IInjectorInstaller> installer1Mock = new Mock<IInjectorInstaller>(); |
||||
Mock<IInjectorInstaller> installer2Mock = new Mock<IInjectorInstaller>(); |
||||
Mock<IInjectorInstaller> installer3Mock = new Mock<IInjectorInstaller>(); |
||||
|
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
IInjectorContainer returnedContainer = injectorContainer.Install(installer1Mock.Object, installer2Mock.Object, installer3Mock.Object); |
||||
|
||||
installer1Mock.Verify(m => m.Install(It.IsAny<IInjectorContainer>()), Times.Once); |
||||
installer2Mock.Verify(m => m.Install(It.IsAny<IInjectorContainer>()), Times.Once); |
||||
installer3Mock.Verify(m => m.Install(It.IsAny<IInjectorContainer>()), Times.Once); |
||||
|
||||
Assert.AreEqual(injectorContainer, returnedContainer); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveNotRegistered() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
|
||||
Assert.Throws<TypeNotRegisteredException>(() => injectorContainer.Resolve<ITest>()); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolve() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
ITest resolvedTest = injectorContainer.Resolve<ITest>(); |
||||
|
||||
Assert.IsInstanceOf<Test>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveWithParams() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
|
||||
ITest resolvedTest = injectorContainer.Resolve<ITest>("Test", new Test()); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveWithMissingParam() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
injectorContainer.Register(RegistrationFactory.Register<Test, Test>()); //this registration is abnormal and should only be used in unit tests |
||||
|
||||
ITest resolvedTest = injectorContainer.Resolve<ITest>("Test"); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveReflection() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
object resolvedTest = injectorContainer.Resolve(typeof(ITest), null); |
||||
|
||||
Assert.IsInstanceOf<Test>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveSingleton() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>(Lifestyle.Singleton)); |
||||
|
||||
ITest resolvedTest = injectorContainer.Resolve<ITest>(); |
||||
ITest secondResolvedTest = injectorContainer.Resolve<ITest>(); |
||||
|
||||
Assert.AreEqual(resolvedTest, secondResolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveTransient() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
ITest resolvedTest = injectorContainer.Resolve<ITest>(); |
||||
ITest secondResolvedTest = injectorContainer.Resolve<ITest>(); |
||||
|
||||
Assert.AreNotEqual(resolvedTest, secondResolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFactory() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
injectorContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(injectorContainer)); |
||||
|
||||
ITestFactory testFactory = injectorContainer.Resolve<ITestFactory>(); |
||||
|
||||
Assert.IsInstanceOf<ITestFactory>(testFactory); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFromFactory() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
injectorContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(injectorContainer)); |
||||
|
||||
ITestFactory testFactory = injectorContainer.Resolve<ITestFactory>(); |
||||
ITest createdTest = testFactory.Create(); |
||||
|
||||
Assert.IsInstanceOf<Test>(createdTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFromFactoryWithParams() |
||||
{ |
||||
IInjectorContainer injectorContainer = new InjectorContainer(); |
||||
injectorContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
injectorContainer.Register(RegistrationFactory.Register<Test, Test>()); //this registration is abnormal and should only be used in unit tests |
||||
injectorContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(injectorContainer)); |
||||
|
||||
ITestFactory testFactory = injectorContainer.Resolve<ITestFactory>(); |
||||
ITest createdTest = testFactory.Create("Test"); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(createdTest); |
||||
} |
||||
} |
||||
} |
||||
@ -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 IocContainerTest |
||||
{ |
||||
#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<IIocInstaller> installerMock = new Mock<IIocInstaller>(); |
||||
|
||||
IIocContainer iocContainer = new IocContainer(); |
||||
IIocContainer returnedContainer = iocContainer.Install(installerMock.Object); |
||||
|
||||
installerMock.Verify(m => m.Install(It.IsAny<IIocContainer>()), Times.Once); |
||||
|
||||
Assert.AreEqual(iocContainer, returnedContainer); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestInstallMultiple() |
||||
{ |
||||
Mock<IIocInstaller> installer1Mock = new Mock<IIocInstaller>(); |
||||
Mock<IIocInstaller> installer2Mock = new Mock<IIocInstaller>(); |
||||
Mock<IIocInstaller> installer3Mock = new Mock<IIocInstaller>(); |
||||
|
||||
IIocContainer iocContainer = new IocContainer(); |
||||
IIocContainer returnedContainer = iocContainer.Install(installer1Mock.Object, installer2Mock.Object, installer3Mock.Object); |
||||
|
||||
installer1Mock.Verify(m => m.Install(It.IsAny<IIocContainer>()), Times.Once); |
||||
installer2Mock.Verify(m => m.Install(It.IsAny<IIocContainer>()), Times.Once); |
||||
installer3Mock.Verify(m => m.Install(It.IsAny<IIocContainer>()), Times.Once); |
||||
|
||||
Assert.AreEqual(iocContainer, returnedContainer); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveNotRegistered() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
|
||||
Assert.Throws<TypeNotRegisteredException>(() => iocContainer.Resolve<ITest>()); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolve() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
ITest resolvedTest = iocContainer.Resolve<ITest>(); |
||||
|
||||
Assert.IsInstanceOf<Test>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveWithParams() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
|
||||
ITest resolvedTest = iocContainer.Resolve<ITest>("Test", new Test()); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveWithMissingParam() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
iocContainer.Register(RegistrationFactory.Register<Test, Test>()); //this registration is abnormal and should only be used in unit tests |
||||
|
||||
ITest resolvedTest = iocContainer.Resolve<ITest>("Test"); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveReflection() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
object resolvedTest = iocContainer.Resolve(typeof(ITest), null); |
||||
|
||||
Assert.IsInstanceOf<Test>(resolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveSingleton() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>(Lifestyle.Singleton)); |
||||
|
||||
ITest resolvedTest = iocContainer.Resolve<ITest>(); |
||||
ITest secondResolvedTest = iocContainer.Resolve<ITest>(); |
||||
|
||||
Assert.AreEqual(resolvedTest, secondResolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveTransient() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
|
||||
ITest resolvedTest = iocContainer.Resolve<ITest>(); |
||||
ITest secondResolvedTest = iocContainer.Resolve<ITest>(); |
||||
|
||||
Assert.AreNotEqual(resolvedTest, secondResolvedTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFactory() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
iocContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(iocContainer)); |
||||
|
||||
ITestFactory testFactory = iocContainer.Resolve<ITestFactory>(); |
||||
|
||||
Assert.IsInstanceOf<ITestFactory>(testFactory); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFromFactory() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, Test>()); |
||||
iocContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(iocContainer)); |
||||
|
||||
ITestFactory testFactory = iocContainer.Resolve<ITestFactory>(); |
||||
ITest createdTest = testFactory.Create(); |
||||
|
||||
Assert.IsInstanceOf<Test>(createdTest); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestResolveFromFactoryWithParams() |
||||
{ |
||||
IIocContainer iocContainer = new IocContainer(); |
||||
iocContainer.Register(RegistrationFactory.Register<ITest, TestConstructor>()); |
||||
iocContainer.Register(RegistrationFactory.Register<Test, Test>()); //this registration is abnormal and should only be used in unit tests |
||||
iocContainer.Register(RegistrationFactory.RegisterFactory<ITestFactory>(iocContainer)); |
||||
|
||||
ITestFactory testFactory = iocContainer.Resolve<ITestFactory>(); |
||||
ITest createdTest = testFactory.Create("Test"); |
||||
|
||||
Assert.IsInstanceOf<TestConstructor>(createdTest); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue