46

IService给定一个具有Method1()和的接口Method2()

我想测试当Method1()抛出一个Exception, Method2() 被调用并返回一个给定的值

(在抛出Method2()时调用)。Method1()

因此我需要Method2()用一个 fake来测试一个 real 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.

4

2 回答 2

74

你可以这样做:

var mock = new Mock<MyNetworkStream>(){ CallBase = true };
mock.Setup(m => m.Method1....

上面的代码将对任何未明确设置的方法/属性使用 MyNetworkStream 的实际实现。即它将调用真正的Method2(),而Method1() 将是模拟版本。

CallBase=true通常是为了测试抽象类(如果这是对还是错,超出了这个问题的范围)。

于 2013-09-27T21:30:15.890 回答
10

在这种情况下(除非还有更多事情要做),我只需要创建自己的测试类来扩展具有真实行为的类,实现您需要模拟的接口。通过这种方式,您可以模拟一个值,并回退到基类以获得真正的功能。

于 2013-09-27T16:08:17.280 回答