如何模拟棱镜 IContainerRegistry
How to mock Prisms IContainerRegistry
- Prism.Ninject7.1.0.431
- 棱镜 7.1.0.431
- NUnit 3.3.3
- N代入
之前使用 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]'.
如果有人知道我如何模拟这个,我将不胜感激,因为我目前正处于僵局。
我想我已经弄明白了(或者至少取得了进步)
我不得不使用以下内容代替 IContainerRegistry
protected override void Given()
{
TestKernel = new StandardKernel();
TestContainerRegistry = Substitute.For<IContainerExtension<IKernel>>();
TestContainerRegistry.GetContainer().Returns( TestKernel );
SUT = new MyModule();
}
虽然看起来我将不得不制作更多的替代品等,以便 containerRegistry.Register(等)在我的 TestKernel 中结束以进行验证。
你应该如何测试一直是一个充满分歧的热门话题,所以我会尽量在这里给你一些一般性的信息。 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>());
- Prism.Ninject7.1.0.431
- 棱镜 7.1.0.431
- NUnit 3.3.3
- N代入
之前使用 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]'.
如果有人知道我如何模拟这个,我将不胜感激,因为我目前正处于僵局。
我想我已经弄明白了(或者至少取得了进步)
我不得不使用以下内容代替 IContainerRegistry
protected override void Given()
{
TestKernel = new StandardKernel();
TestContainerRegistry = Substitute.For<IContainerExtension<IKernel>>();
TestContainerRegistry.GetContainer().Returns( TestKernel );
SUT = new MyModule();
}
虽然看起来我将不得不制作更多的替代品等,以便 containerRegistry.Register(等)在我的 TestKernel 中结束以进行验证。
你应该如何测试一直是一个充满分歧的热门话题,所以我会尽量在这里给你一些一般性的信息。 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>());