Как издеваться над Призмами 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 для проверки.