MockingKernel назвал Multi-Bindings в качестве аргумента конструктора - PullRequest
0 голосов
/ 07 декабря 2018

Допустим, у меня есть интерфейс с двумя реализациями

public interface IWeapon
{
    string Hit(string target);
}

public class Sword : IWeapon 
{
    public string Hit(string target) 
    {
        return "Slice " + target + " in half";
    }
}

public class Dagger : IWeapon 
{
    public string Hit(string target) 
    {
        return "Stab " + target + " to death";
    }
}

У меня есть объект, который принимает Sword и Dagger.Я использую Named мульти-привязки, как описано в документах .

public class Samurai: ISamurai
{
    private readonly IWeapon sword;
    private readonly IWeapon dagger;

    public Samurai(
        [Named(nameof(Sword))] IWeapon sword,
        [Named(nameof(Dagger))] IWeapon dagger)
    {
        this.sword = sword;
        this.dagger = dagger;
    }
}

. Это прекрасно работает, когда я использую его с нормальной привязкой во время выполнения:

DependencyInjector.Kernel.Bind<IWeapon>().To<Sword>().Named(nameof(Sword));
DependencyInjector.Kernel.Bind<IWeapon>().To<Dagger>().Named(nameof(Dagger));

Это не работает, когда я использую имитирующее ядро:

Mock<IWeapon> mockSword = new Mock<IWeapon>();
Mock<IWeapon> mockDagger = new Mock<IWeapon>();

MockingKernel.Rebind<IWeapon>().ToConstant(mockSword.Object).Named(nameof(Sword));
MockingKernel.Rebind<IWeapon>().ToConstant(mockDagger.Object).Named(nameof(Dagger));

MockingKernel.Get<Samurai>();

Я получаю следующий тип ошибки:

Message: OneTimeSetUp: Ninject.ActivationException : Error activating 
IWeapon
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency IWeapon into parameter             
sword of constructor of type ISamurai
  1) Request for ISamurai

1 Ответ

0 голосов
/ 10 декабря 2018

Проблема с методом Rebind<IWeapon>() состоит в том, что он удаляет все привязки, основанные на IWeapon, даже если вы позже укажете синтаксис Named.Это означает, что второй вызов повторного связывания удаляет первый.Попробуйте вместо этого:

MockingKernel.Rebind<IWeapon>().ToConstant(mockSword.Object).Named(nameof(Sword));
MockingKernel.Bind<IWeapon>().ToConstant(mockDagger.Object).Named(nameof(Dagger));
...