如何使用Moq在受保护的方法上设置回调?

时间:2015-11-20 11:06:42

标签: moq

我无法使用Moq(v.4.2)在受保护的方法上设置回调。

代码如下:

public abstract class AbstractClass
{
    protected abstract void OneProtectedMethod();
}

public class OneClass : AbstractClass
{
    protected override void OneProtectedMethod()
    {
        Console.WriteLine("Hello");
    }

    public void DoMethod()
    {
        OneProtectedMethod();
    }
}

[Test]
public void should_call_protected_method()
{
    var mock = new Mock<OneClass>();

    mock.Protected().Setup("OneProtectedMethod").Callback(() => Console.WriteLine("Goodbye"));

    var o = new OneClass();

    o.DoMethod();

    mock.Protected().Verify("OneProtectedMethod", Times.Once());
}

我在这里做错了吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您的受保护方法的设置运行良好,但它需要以某种方式与被测试的类相关。想象一下类似下面的一类。它依赖于OneClass,并且可以在单元测试中模拟这种依赖。

public class Master
{
    // Master hes dependency on OneClass
    private readonly OneClass _dependency; 

    public Master(OneClass dependency)
    {
        _dependency = dependency;
    }

    public bool DoSomething()
    {
        // ... some code
        // dependency is used here
        _dependency.DoMethod();
        // ... some code

        return true;
    }
}

然后测试看起来像下面这样。

[TestMethod]
public void DoSomething_WhenCalled_ReturnsTrue()
{
    // Arrange
    var mock = new Mock<OneClass>();
    mock.Protected().Setup("OneProtectedMethod").Callback(() => Debug.WriteLine("Goodbye"));
    var master = new Master(mock.Object);

    // Act
    master.DoSomething();

    // Assert
    // ...
}

这里将使用OneProtectedMethod方法的模拟版本。所以在输出中只会写入文本Goodbye,真实的实现将被模拟。 HTH。