如何测试我的工厂是否正确绑定?

时间:2014-09-10 17:00:46

标签: unit-testing ninject fluent-assertions compositionroot

使用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();
}

有没有什么好方法可以测试工厂是否真正受到约束?

2 个答案:

答案 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会抛出一个异常,说明这个接口有多个绑定。