给定具有IService
和Method1()
的接口Method2()
。
我想测试当Method1()
抛出Exception
,Method2(
)并且返回给定值时。
(Method2()
抛出时调用Method1()
。
因此,我需要使用假Method2()
测试真实Method1()
,它们是相同界面的方法。
这是我的测试代码:
MBase sut.MethodX()
是唯一的切入点。它使用IService
。
我的目标是断言Method2()
返回某事。
// Arrange
// Fake bytes in.
var networkStreamMock = new Mock<INetworkStream>();
networkStreamMock.Method1(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())).Returns(It.IsAny<byte[]>());
// Force throw TimeoutException.
var mock = new Mock<IService>();
mock.Setup(x => x.Method1(new Message
{
Xml = Xml,
}
)).Throws<TimeoutException>();
// Check Method 2 is called. (this is done in its own test so commented out)
// mock.Setup(m => m.Method2(It.IsAny<Message>())).Verifiable();
// New MBase.
IKernel kernel = new StandardKernel(new FakeBindings());
kernel.Rebind<IService>().ToConstant(mock.Object);
MBase sut = kernel.Get<M>();
// Act
sut.MethodX(networkStreamMock.Object);
// Here I would like to assert on the return value of Method2
mock.Verify(m => m.Method2(It.IsAny<Message>()));
这可能与Moq或其他模拟框架有关吗?我该怎么做?
我可以使用Method1()
的虚假实现和Method2()
的实际实现创建一个手动模拟,但我想知道是否有更好的方法。
我已经单独测试了IService
但我现在希望测试它与MBase
的互动。
答案 0 :(得分:57)
你可以这样做:
var mock = new Mock<MyNetworkStream>(){ CallBase = true };
mock.Setup(m => m.Method1....
上面的代码将使用MyNetworkStream的实际实现来获取未明确设置的任何方法/属性。即它将调用真正的Method2(),而Method1()将是模拟版本。
CallBase=true
通常用于测试抽象类(如果这是对或错,则超出了本问题的范围)。
答案 1 :(得分:8)
在这种情况下(除非还有更多内容)我将创建自己的测试类,使用真实行为扩展类,实现您需要模拟的接口。这样,您可以模拟一个值,并回退到实际功能的基类。