如何解析我的依赖项以进行测试?

时间:2013-08-15 04:15:44

标签: asp.net-mvc-4 dependency-injection castle-windsor integration-testing ioc-container

我的控制器具有使用Castle Windsor进行依赖注入的依赖关系。

这很好用,甚至允许我用“模拟”依赖项替换一些依赖项,以便我可以测试我的控制器。

但是,假设我有以下内容:

Public Class AccountController
    Inherits Controller

    Public Property SecurityService As ISecurityService

    Public Sub New(securityService As ISecurityService)
        Me.SecurityService = securityService
    End Sub

End Class

Public Class DefaultSecurityService
    Implements ISecurityService

    Public Property SomeDependency As ISomeClass

End Class

在这种情况下,我的AccountController取决于拥有ISecurityService,然后依赖于某种类型的其他类。我的情况更复杂,抽象更多。我绝对无法直接向SecurityService注入任何内容。

这让我觉得我的DI容器可以帮我。我希望Castle Windsor能够在运行测试(例如集成测试)时识别并将任何服务替换为它找到的任何“模拟”服务。这意味着我可以定义一个名为ISomeClass的模拟MockSomeClass,而Castle Windsor会自动注入一个而不是常规类。

如何实现这一目标?我在这个主题上找到的唯一信息是Auto-mocking Container Mark Seemann。但它很复杂,我不确定它是否与我需要的相关。

(代码示例中可接受VB.NET和C#)

1 个答案:

答案 0 :(得分:2)

鉴于您可以将一个接口注入控制器意味着defaultsecutiryservice的依赖关系没有实际意义。

只需使用您选择的模拟工具,如MOQ,RhinoMocks等,然后为其中一个模拟器提供帐户控制。

在MOQ中,我会做以下事情:

 var service = new Mock<ISecurityService>();
 service.setup(s= > s.SomeCall(It.IsAny<int>())).Returns(new List<OfSomething>());

 var controller = new AccountController(service.Object);


 controller.DoSomething(5); // call on service as check the result here

 service.Verify(m => m.SomeCall(It.Is<int>(i => i == 5)), Times.Once());

使用这样的模拟工具,您不必担心依赖项的依赖性,因为它不是您正在测试的依赖项,而只是两者之间的交互。

当你来测试DefaultSecurityService时,就需要担心它的依赖性。

HTH