Unit test hinzugefügt

This commit is contained in:
Holger Boerchers 2018-08-19 21:37:03 +02:00
parent d7e6dcc3b2
commit fed5a3b443
17 changed files with 115 additions and 59 deletions

View File

@ -0,0 +1,18 @@
using SmallInjectorDemo;
using Xunit;
namespace InjectorTest
{
public class HelperTest
{
[Fact]
public void Test()
{
const string expected = "[-] HelperTest.Test Id: 0";
var actual = Helper.WriteMethodString(new TestClock(), 0);
Assert.Equal(expected, actual);
}
}
}

View File

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SmallInjectorDemo\SmallInjectorDemo.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,9 @@
using SmallInjectorDemo;
namespace InjectorTest
{
public class TestClock : IClock
{
public string CurrentDateTime => "-";
}
}

View File

@ -1,40 +0,0 @@
using System;
using System.Security.Cryptography;
namespace SmallInjectorDemo
{
/// <summary>
/// Static helper class for generating random numbers.
/// </summary>
public static class RandomHelper
{
/// <summary>
/// Return cryptographic stable random integer.
/// </summary>
/// <param name="min">Lower border of result.</param>
/// <param name="max">Upper border of result.</param>
/// <returns>Random integer.</returns>
public static int NewRandomInteger(int min, int max)
{
// The random number provider.
using (var rand = new RNGCryptoServiceProvider())
{
uint scale = uint.MaxValue;
while (scale == uint.MaxValue)
{
// Get four random bytes.
var four_bytes = new byte[4];
rand.GetBytes(four_bytes);
// Convert that into an uint.
scale = BitConverter.ToUInt32(four_bytes, 0);
}
// Add min to the scaled difference between max and min.
return (int)(min + (max - min) *
(scale / (double)uint.MaxValue));
}
}
}
}

View File

@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.26124.0 VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0 MinimumVisualStudioVersion = 15.0.26124.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmallInjectorDemo", "SmallInjectorDemo.csproj", "{620CC001-7DF9-4233-AFC2-187FD9144835}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmallInjectorDemo", "SmallInjectorDemo\SmallInjectorDemo.csproj", "{620CC001-7DF9-4233-AFC2-187FD9144835}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InjectorTest", "InjectorTest\InjectorTest.csproj", "{0648782E-EB73-4326-9471-CE386C1FBC4D}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -27,6 +29,18 @@ Global
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x64.Build.0 = Release|Any CPU {620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x64.Build.0 = Release|Any CPU
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.ActiveCfg = Release|Any CPU {620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.ActiveCfg = Release|Any CPU
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.Build.0 = Release|Any CPU {620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.Build.0 = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|x64.ActiveCfg = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|x64.Build.0 = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|x86.ActiveCfg = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Debug|x86.Build.0 = Debug|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|Any CPU.Build.0 = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|x64.ActiveCfg = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|x64.Build.0 = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|x86.ActiveCfg = Release|Any CPU
{0648782E-EB73-4326-9471-CE386C1FBC4D}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -25,31 +25,31 @@ namespace SmallInjectorDemo
while (scale == uint.MaxValue) while (scale == uint.MaxValue)
{ {
// Get four random bytes. // Get four random bytes.
var four_bytes = new byte[4]; var fourBytes = new byte[4];
rand.GetBytes(four_bytes); rand.GetBytes(fourBytes);
// Convert that into an uint. // Convert that into an uint.
scale = BitConverter.ToUInt32(four_bytes, 0); scale = BitConverter.ToUInt32(fourBytes, 0);
} }
// Add min to the scaled difference between max and min. // Add min to the scaled difference between max and min.
return (int) (min + (max - min) * (scale / (double) uint.MaxValue)); return (int)(min + (max - min) * (scale / (double)uint.MaxValue));
} }
} }
/// <summary> /// <summary>
/// Write method string. /// Write method string.
/// </summary> /// </summary>
/// <param name="clock">The current clock</param>
/// <param name="id">id of the object</param> /// <param name="id">id of the object</param>
/// <param name="memberName">member name</param> /// <param name="memberName">member name</param>
/// <param name="filepath">file path</param> /// <param name="filepath">file path</param>
/// <returns></returns> /// <returns></returns>
public static string WriteMethodString(int id, [CallerMemberName] string memberName = null, [CallerFilePath] string filepath = null) public static string WriteMethodString(IClock clock, int id, [CallerMemberName] string memberName = null, [CallerFilePath] string filepath = null)
{ {
var classname = Path.GetFileNameWithoutExtension(filepath); var classname = Path.GetFileNameWithoutExtension(filepath);
return $"{classname}.{memberName?.TrimStart('.')}".PadRight(30) + $"Id: {id}"; return $"[{clock.CurrentDateTime}] {classname}.{memberName?.TrimStart('.')}".PadRight(30) + $"Id: {id}";
} }
} }
} }

View File

@ -0,0 +1,13 @@
namespace SmallInjectorDemo
{
/// <summary>
/// Interface of the clock.
/// </summary>
public interface IClock
{
/// <summary>
/// Current Date-Time.
/// </summary>
string CurrentDateTime { get; }
}
}

View File

@ -8,6 +8,8 @@ namespace SmallInjectorDemo
{ {
Console.WriteLine("Small dependency injection example"); Console.WriteLine("Small dependency injection example");
var injector = new SmallInjector(); var injector = new SmallInjector();
Console.WriteLine("Register " + nameof(SystemClock));
injector.RegisterType<SystemClock, IClock>(true);
Console.WriteLine("Register " + nameof(ServiceOne)); Console.WriteLine("Register " + nameof(ServiceOne));
injector.RegisterType<ServiceOne, IServiceOne>(true); injector.RegisterType<ServiceOne, IServiceOne>(true);
Console.WriteLine("Register " + nameof(ServiceTwo)); Console.WriteLine("Register " + nameof(ServiceTwo));
@ -27,7 +29,7 @@ namespace SmallInjectorDemo
useful2.TestTheServices(); useful2.TestTheServices();
Console.WriteLine(); Console.WriteLine();
useful3.TestTheServices(); useful3.TestTheServices();
//Console.ReadLine(); Console.ReadLine();
} }
} }
} }

View File

@ -7,6 +7,7 @@ namespace SmallInjectorDemo
/// </summary> /// </summary>
public class ServiceConsumer public class ServiceConsumer
{ {
private readonly IClock _clock;
private readonly IServiceOne _service1; private readonly IServiceOne _service1;
private readonly IServiceTwo _service2; private readonly IServiceTwo _service2;
private readonly int _id; private readonly int _id;
@ -14,14 +15,16 @@ namespace SmallInjectorDemo
/// <summary> /// <summary>
/// Creates a new instance of <see cref="ServiceConsumer"/>. /// Creates a new instance of <see cref="ServiceConsumer"/>.
/// </summary> /// </summary>
/// <param name="clock">The current clock</param>
/// <param name="service1">injected service one.</param> /// <param name="service1">injected service one.</param>
/// <param name="service2">injected service two.</param> /// <param name="service2">injected service two.</param>
public ServiceConsumer(IServiceOne service1, IServiceTwo service2) public ServiceConsumer(IClock clock, IServiceOne service1, IServiceTwo service2)
{ {
_clock = clock;
_service1 = service1; _service1 = service1;
_service2 = service2; _service2 = service2;
_id = Helper.NewRandomInteger(10, 99); _id = Helper.NewRandomInteger(10, 99);
Console.WriteLine(Helper.WriteMethodString(_id)); Console.WriteLine(Helper.WriteMethodString(clock, _id));
} }
/// <summary> /// <summary>
@ -35,7 +38,7 @@ namespace SmallInjectorDemo
} }
/// <inheritdoc /> /// <inheritdoc />
public override string ToString() => Helper.WriteMethodString(_id); public override string ToString() => Helper.WriteMethodString(_clock, _id);
} }
} }

View File

@ -8,19 +8,21 @@ namespace SmallInjectorDemo
/// </summary> /// </summary>
public class ServiceOne : IServiceOne public class ServiceOne : IServiceOne
{ {
private readonly IClock _clock;
private readonly int _id; private readonly int _id;
/// <summary> /// <summary>
/// Creates a new instance of <see cref="ServiceOne"/>. /// Creates a new instance of <see cref="ServiceOne"/>.
/// </summary> /// </summary>
public ServiceOne() public ServiceOne(IClock clock)
{ {
_clock = clock;
_id = Helper.NewRandomInteger(10, 99); _id = Helper.NewRandomInteger(10, 99);
Console.WriteLine(Helper.WriteMethodString(_id)); Console.WriteLine(Helper.WriteMethodString(clock, _id));
} }
/// <inheritdoc /> /// <inheritdoc />
public override string ToString() => Helper.WriteMethodString(_id); public override string ToString() => Helper.WriteMethodString(_clock, _id);
} }
/// <summary> /// <summary>

View File

@ -8,19 +8,21 @@ namespace SmallInjectorDemo
/// </summary> /// </summary>
public class ServiceTwo : IServiceTwo public class ServiceTwo : IServiceTwo
{ {
private readonly IClock _clock;
private readonly int _id; private readonly int _id;
/// <summary> /// <summary>
/// Creates a new instance of <see cref="ServiceTwo"/>. /// Creates a new instance of <see cref="ServiceTwo"/>.
/// </summary> /// </summary>
public ServiceTwo() public ServiceTwo(IClock clock)
{ {
_clock = clock;
_id = Helper.NewRandomInteger(10, 99); _id = Helper.NewRandomInteger(10, 99);
Console.WriteLine(Helper.WriteMethodString(_id)); Console.WriteLine(Helper.WriteMethodString(clock, _id));
} }
/// <inheritdoc /> /// <inheritdoc />
public override string ToString() => Helper.WriteMethodString(_id); public override string ToString() => Helper.WriteMethodString(_clock, _id);
} }
/// <summary> /// <summary>

View File

@ -0,0 +1,11 @@
using System;
namespace SmallInjectorDemo
{
/// <inheritdoc />
public class SystemClock : IClock
{
/// <inheritdoc />
public string CurrentDateTime => DateTime.Now.ToString("O");
}
}

View File

@ -20,7 +20,7 @@ namespace SmallInjectorDemo
{ {
_service1 = service1; _service1 = service1;
_service2 = service2; _service2 = service2;
_rand = RandomHelper.NewRandomInteger(10, 99); _rand = Helper.NewRandomInteger(10, 99);
Console.WriteLine(nameof(UsefulClass) + ".ctor\tId: " + _rand); Console.WriteLine(nameof(UsefulClass) + ".ctor\tId: " + _rand);
} }