如何使用 Moq 在受保护的方法上设置回调?
How to setup a callback on a protected method using 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());
}
我是不是做错了什么?
谢谢。
您的受保护方法设置运行良好,但它需要以某种方式与正在测试的 class 相关。想象一些 class 像下面这样的。它依赖于 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.
我无法使用 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());
}
我是不是做错了什么?
谢谢。
您的受保护方法设置运行良好,但它需要以某种方式与正在测试的 class 相关。想象一些 class 像下面这样的。它依赖于 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.