如何避免或UnitTest意外使用具体的单例类型而不是使用StructureMap进行抽象

pac*_*man 5 c# structuremap unit-testing

我最近在我的代码中遇到了以下错误,这使我无法进行调试.我想基于它的接口注入一个实例,如下所示:

MovementController(IMotorController motorController)
Run Code Online (Sandbox Code Playgroud)

但是我不小心使用了这样的具体类型:

MovementController(MotorController motorController)
Run Code Online (Sandbox Code Playgroud)

该项目仍然构建并运行良好,直到我尝试motorControllerMovementController实例访问.由于IMotorController访问硬件的底层实现,它必须是单例或我的锁代码.但是,由于我有其他类注入IMotorController,我现在MotorController在对象图中有两个实例,它们都通过串行连接访问硬件.这导致错误,在运行时处于更低的水平,这让我永远调试并找到真正的原因.

如何避免这种类型的错误或为我的StructureMap注册表编写单元测试以捕获这个微妙的错误?

pac*_*man 0

好的。因此,我为单元测试提出的解决方案是获取所有实现IMotorController并断言其计数等于的实例1

 var motorControllerInstances = container.GetAllInstances<IMotorController>().Select(x => x); // cast enumerable to List using Linq
 Assert.True(motorControllerInstances.Count == 1);
Run Code Online (Sandbox Code Playgroud)

不确定这是最优雅的方式,但它似乎有效。

更新 1: 此代码没有捕获我遇到的错误。我仍在寻找我的问题的正确答案。

更新2:我越来越接近了。如果您不小心注册了相应接口的具体类型,这至少会捕获。然而,它似乎并没有检查它的实例是否确实被构建。

    var allInterfaceInstances = dicFixture.result.Model.GetAllPossible<IMotorController>();
    Assert.True(allInterfaceInstance.Count() == 1);
Run Code Online (Sandbox Code Playgroud)