使用Ninject,我有以下内容,并希望使用FluentAssertions进行测试:
[Test]
public void InterfacesEndingWithFactoryShouldBeBoundAsFactories() {
// Given
IKernel kernel = new StandardKernel();
kernel.Bind(services => services
.From(AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => !a.FullName.Contains("Tests")))
.SelectAllInterfaces()
.EndingWith("Factory")
.BindToFactory()
);
// When
var factory = kernel.Get<ICustomerManagementPresenterFactory>();
// Then
factory.Should().NotBeNull();
}
有没有什么好方法可以测试工厂是否真正受到约束?
答案 0 :(得分:2)
我为Fluent Assertions编写了一个extension package来测试我的Ninject绑定。使用它,您的测试可以像这样重写:
[Test]
public void InterfacesEndingWithFactoryShouldBeBoundAsFactories() {
// Given
IKernel kernel = new StandardKernel();
kernel.Bind(services => services
.From(AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => !a.FullName.Contains("Tests")))
.SelectAllInterfaces()
.EndingWith("Factory")
.BindToFactory()
);
// When
// Then
kernel.Should().Resolve<ICustomerManagementPresenterFactory>().WithSingleInstance()
}
正如@Will Marcouiller所建议的,我还会提取代码来将内核引导到它自己的类中,这样就可以在应用程序的组合根和单元测试中调用它。
答案 1 :(得分:1)
首先,没有ninject基础设施来测试哪些类型受影响,哪些不受影响。由于语法流畅,并且在调用方法时返回了许多接口,因此单元测试非常复杂。所以你几乎可以做的就是集成测试。
现在,在我看来,From(...)
是有问题的。如果您要创建一个可以替换传递给From
的程序集的组件,请创建一个包含几种类型的额外测试程序集,然后测试是否可以说interface IFoo
未绑定,{绑定{1}},interface IFooFactory
未绑定,...您将进行正常运行的集成测试。
但是,请考虑,如果class Foo
没有绑定而IFooFactory
使用SomeClass
作为构造函数参数,则ninject将抛出异常。现在,如果你有一个composition root,只需启动应用程序就会告诉你是否存在必要的绑定。
此测试比工厂常规集成测试更有用。考虑是否有人意外地手动绑定了工厂。这不会出现在约定集成测试中,但启动应用程序时,ninject会抛出一个异常,说明这个接口有多个绑定。