1

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

有什么好的方法可以测试工厂是否真的绑定正确?

4

2 回答 2

2

我为 Fluent Assertions 编写了一个扩展包来测试我的 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 所建议的那样,我还将提取代码以将内核引导到它自己的类中,以便可以在应用程序的组合根目录和单元测试中调用它。

于 2014-09-11T15:48:30.203 回答
1

首先,没有 ninject 基础设施来测试哪些类型受到影响,哪些不受影响。由于语法流畅,单元测试非常复杂,调用方法时返回的接口很多。因此,您实际上所能做的就是集成测试。

现在,在我看来,这From(...)是有问题的。如果您要创建一个可以替换您传递给的程序集的组件From,请创建一个包含几种类型的额外测试程序集,然后测试是否让我们说interface IFoo未绑定、interface IFooFactory已绑定、class Foo未绑定……您将拥有一个功能集成测试。

但是请考虑,如果没有绑定IFooFactorySomeClass用作IFooFactory构造函数参数,则 ninject 将抛出异常。现在,如果您有一个组合根,只需启动应用程序就会告诉您是否存在必要的绑定。

这个测试比工厂约定集成测试更有用。考虑一下是否有人不小心手动绑定了工厂。这不会出现在约定集成测试中,但是启动应用程序时,ninject 会抛出一个异常,指出这个接口有多个绑定。

于 2014-09-11T05:55:48.927 回答