为什么在使用AutoMock.GetLoose()时断点永远不会被命中?

时间:2019-08-20 19:47:02

标签: c# unit-testing visual-studio-2017 moq

请考虑以下简单测试:

[Fact]
public void Should_Test_Something()
{
    using (var mock = AutoMock.GetLoose())
    {
        using (var workflow = mock.Create<IWorkflow>())
        {
            var result = workflow.DoSomething();
            // ...
        }
    }
}

DoSomething()内设置断点时,Visual Studio将永远不会断点。这是为什么?我可以顺利完成测试,没有任何问题。

public interface IWorkflow
{
    bool DoSomething();
}

public class Workflow : IWorkflow
{
    public Workflow( // Some long list of dependencies...)

    public bool DoSomething()
    {
        // I do something, a breakpoint set here does never get hit
    }
}

1 个答案:

答案 0 :(得分:3)

  

在DoSomething()中设置断点时,Visual Studio将永远不会在其上断点。这是为什么?我可以顺利完成测试。

因为该接口正在被模拟和使用。不是实际的类实现。

这是模拟界面的全部要点。这样就不会使用实际的类。而是界面的模拟。

  

我如何以隔离的方式测试我的方法DoSomething(),而不必提供所有依赖项?

您将需要模拟所有依赖关系,并使用这些依赖关系初始化实际的类。

[Fact]
public void Should_Test_Something() {
    using (var mock = AutoMock.GetLoose()) {
        //Arrange
        IWorkflow workflow = mock.Create<Workflow>(); //<-- note asking for actual class

        //Act
        var result = workflow.DoSomething();

        //Assert
        // ...assert expected behavior            
    }
}

提供的所有依赖关系都可以在没有不良行为的情况下创建,并带有创建依赖关系的模拟对象的自动模拟并将其传递给类。