Как издеваться над Призмами IContainerRegistry

  • Prism.Ninject 7.1.0.431
  • Призма 7.1.0.431
  • NUnit 3.3.3
  • NSubstitute

Ранее с использованием Prism 6.3 у нас был набор модульных тестов, чтобы подтвердить, что у нас были все наши привязки на месте следующим образом

protected IKernel TestKernel;

[SetUp]
public void Given
{
    TestKernel = new StandardKernel();
    SUT = new MyModule( TestKernel );

    Core = Assembly.Load( "MyDLL.Core" ).GetTypes();
    Common = Assembly.Load( "MyDLL.Common" ).GetTypes();

    SUT.Initialize();
}

[ Test ]
public void Then_ViewModels_Will_Be_Bound()
{
    var testCollection = Common
        .Where( item => item.IsPublic )
        .Where( item => item.Name.EndsWith( "ViewModel" ) );

    foreach ( var item in testCollection )
    {
        Assert.That( TestKernel.GetBindings( item ).Any, $"Test Failed:  {item.Name}" );
    }
}

Однако в Ninject 7.1 интерфейс IModule несколько изменился, поэтому теперь детали регистрируются по-разному в

public void RegisterTypes(
        IContainerRegistry containerRegistry )

Я просто пытаюсь снова запустить мои модульные тесты с этим новым форматом IModule. Я пытался изменить свой даный следующим образом

protected override void Given()
{
    TestKernel = new StandardKernel();

    TestContainerRegistry = Substitute.For<IContainerRegistry>();
    TestContainerRegistry.GetContainer().Returns( TestKernel );

    SUT = new MyModule();
}

Однако я получаю следующее, когда пытаюсь запустить свои тесты.

System.InvalidCastException: Невозможно привести объект типа 'Castle.Proxies.IContainerRegistryProxy' к типу 'Prism.Ioc.IContainerExtension`1[Ninject.IKernel]'.

Если у кого-то есть идея, как я мог бы высмеять это, это было бы оценено, поскольку я в настоящее время в тупике.

2 ответа

Решение

То, как вы должны проверять, всегда горячая тема, полная разногласий, поэтому я постараюсь дать вам некоторую общую информацию здесь. Prism.Ninject реализует абстракции контейнера с помощью Prism.Ninject.Ioc.NinjectContainerExtension, У этого есть два конструктора, по умолчанию и тот, который позволяет вам передать определенное Ядро.

Prism также реализует методы расширения для каждого из контейнеров, чтобы извлечь контейнер из абстракции. Вы можете достичь этого несколькими способами:

containerRegistry.GetContainer().SomeContainerSpecificApi()

В качестве альтернативы вы можете сделать:

var app = new MyApp();
app.Container.GetContainer().SomeContainerSpecificApi();

Опять же, есть множество способов, которыми вы можете реализовать свои тесты, и я не собираюсь вдаваться в то, как вы должны тестировать. Однако я скажу, что если вы не хотите создавать приложение и вам просто нужно проверить, что ваши типы зарегистрированы для модуля Prism, вы можете попробовать что-то вроде:

var containerExtension = new NinjectContainerExtension();
var module = new MyModule();
module.RegisterTypes(containerExtension);
Assert.IsTrue(containerExtension.Instance.IsRegistered<MyType>());

Я думаю, что я понял это (или сделал успех по крайней мере)

Вместо замены IContainerRegistry я должен был использовать следующее

protected override void Given()
{
    TestKernel = new StandardKernel();

    TestContainerRegistry = Substitute.For<IContainerExtension<IKernel>>();
    TestContainerRegistry.GetContainer().Returns( TestKernel );

    SUT = new MyModule();
}

Хотя, похоже, мне придется сделать больше замен и т. Д. Для того, чтобы containerRegistry.Register (и т. Д.) Попал в мой TestKernel для проверки.

Другие вопросы по тегам