Как издеваться над Призмами IContainerRegistry - PullRequest
0 голосов
/ 18 октября 2018
  • Prism.Ninject 7.1.0.431
  • Prism 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 ]

0 голосов
/ 18 октября 2018

Как вы должны тестировать, это всегда горячая тема, полная разногласий, поэтому я постараюсь дать вам некоторую общую информацию здесь.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>());
0 голосов
/ 18 октября 2018

Мне кажется, я понял (или, по крайней мере, добился прогресса)

Вместо того, чтобы заменить IContainerRegistry, мне пришлось использовать следующее

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

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

    SUT = new MyModule();
}

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

...