parent
97d71c5d10
commit
c29aaac8de
3 changed files with 216 additions and 1 deletions
@ -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<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,20 @@ |
|||||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<TargetFramework>netcoreapp2.1</TargetFramework> |
||||||
|
|
||||||
|
<IsPackable>false</IsPackable> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<ItemGroup> |
||||||
|
<PackageReference Include="Moq" Version="4.11.0" /> |
||||||
|
<PackageReference Include="nunit" Version="3.10.1" /> |
||||||
|
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" /> |
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" /> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
<ItemGroup> |
||||||
|
<ProjectReference Include="..\LightweightIocContainer\LightweightIocContainer.csproj" /> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
</Project> |
||||||
Loading…
Reference in new issue