我无法使用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());
}
我在这里做错了吗?
感谢。
答案 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。