diff --git a/src/Spectre.Console.Testing/Cli/CommandAppTester.cs b/src/Spectre.Console.Testing/Cli/CommandAppTester.cs index 4ad0276..0cd0840 100644 --- a/src/Spectre.Console.Testing/Cli/CommandAppTester.cs +++ b/src/Spectre.Console.Testing/Cli/CommandAppTester.cs @@ -11,6 +11,20 @@ namespace Spectre.Console.Testing private Action? _appConfiguration; private Action? _configuration; + /// + /// Initializes a new instance of the class. + /// + /// The registrar. + public CommandAppTester(ITypeRegistrar? registrar = null) + { + Registrar = registrar; + } + + /// + /// Gets or sets the Registrar to use in the CommandApp. + /// + public ITypeRegistrar? Registrar { get; set; } + /// /// Sets the default command. /// @@ -88,7 +102,7 @@ namespace Spectre.Console.Testing CommandContext? context = null; CommandSettings? settings = null; - var app = new CommandApp(); + var app = new CommandApp(Registrar); _appConfiguration?.Invoke(app); if (_configuration != null) diff --git a/test/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs b/test/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs index 183b2bf..6132197 100644 --- a/test/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs +++ b/test/Spectre.Console.Tests/Unit/Cli/CommandAppTests.Injection.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using Shouldly; using Spectre.Console.Testing; using Spectre.Console.Tests.Data; @@ -30,7 +32,7 @@ namespace Spectre.Console.Tests.Unit.Cli Name = "Hello " + name; } } - + [Fact] public void Should_Inject_Parameters() { @@ -62,6 +64,36 @@ namespace Spectre.Console.Tests.Unit.Cli injected.Age.ShouldBe(35); }); } + + [Fact] + public void Should_Inject_Dependency_Using_A_Given_Registrar() + { + // Given + var dependency = new FakeDependency(); + var registrar = new FakeTypeRegistrar { TypeResolverFactory = FakeTypeResolver.Factory }; + registrar.RegisterInstance(typeof(FakeDependency), dependency); + var app = new CommandAppTester(registrar); + + app.SetDefaultCommand>(); + app.Configure(config => config.PropagateExceptions()); + + // When + var result = app.Run(new[] + { + "--name", "foo", + "--age", "35", + }); + + // Then + result.ExitCode.ShouldBe(0); + result.Settings.ShouldBeOfType().And(injected => + { + injected.ShouldNotBeNull(); + injected.Fake.ShouldBeSameAs(dependency); + injected.Name.ShouldBe("Hello foo"); + injected.Age.ShouldBe(35); + }); + } } } } diff --git a/test/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs b/test/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs index bfc3348..7d38e63 100644 --- a/test/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs +++ b/test/Spectre.Console.Tests/Utilities/FakeTypeRegistrar.cs @@ -8,6 +8,7 @@ namespace Spectre.Console.Testing { public Dictionary> Registrations { get; } public Dictionary> Instances { get; } + public Func>, Dictionary>, ITypeResolver> TypeResolverFactory { get; set; } public FakeTypeRegistrar() { @@ -50,7 +51,7 @@ namespace Spectre.Console.Testing public ITypeResolver Build() { - return null; + return TypeResolverFactory?.Invoke(Registrations, Instances); } } } diff --git a/test/Spectre.Console.Tests/Utilities/FakeTypeResolver.cs b/test/Spectre.Console.Tests/Utilities/FakeTypeResolver.cs new file mode 100644 index 0000000..a571418 --- /dev/null +++ b/test/Spectre.Console.Tests/Utilities/FakeTypeResolver.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Spectre.Console.Cli; + +namespace Spectre.Console.Testing +{ + public sealed class FakeTypeResolver : ITypeResolver + { + private readonly Dictionary> _registrations; + private readonly Dictionary> _instances; + + public FakeTypeResolver( + Dictionary> registrations, + Dictionary> instances) + { + _registrations = registrations ?? throw new ArgumentNullException(nameof(registrations)); + _instances = instances ?? throw new ArgumentNullException(nameof(instances)); + } + + public static Func>, Dictionary>, ITypeResolver> Factory => + (r, i) => new FakeTypeResolver(r, i); + + public object Resolve(Type type) + { + if (_instances.TryGetValue(type, out var instances)) + { + return instances.FirstOrDefault(); + } + + if (_registrations.TryGetValue(type, out var registrations)) + { + return registrations.Count == 0 + ? null + : Activator.CreateInstance(type); + } + + return null; + } + } +} \ No newline at end of file