NMock 两分钟教程
原文:http://confluence.public.thoughtworks.org/display/NMock/Two+minute+tutorial
最后修改:2004-05-30,Chris Stevenson
翻译:NetCobra
本教程假定你对单元测试和NUnit非常熟悉。
作为一个简单的例子,我们来测试一个信息发布/订阅系统。发布者向零到多个订阅者发布数据,我们需要对发布者进行测试,测试发布者和订阅者之间的交互作用。
public interface ISubscriber
{
void Receive(Object message);
}
我们将测试发布者对单个的已注册的 ISubscriber 发布信息,为了检测发布者和 ISubscriber 之间的交互作用,测试过程中我们将使用模拟的 ISubscriber。
首先我们来设置测试所需要的环境。首先要创建一个待测试的 Publisher;然后,我们创建一个模拟的 ISubscriber 用于接收信息;接下来把 ISubscriber 在 Publisher 中进行注册,最后,我们来创建一个 message 对象以进行发布。
Mock mockSubscriber = new DynamicMock(typeof(ISubscriber));
Publisher publisher = new Publisher();
publisher.Add((ISubscriber) mockSubscriber.MockInstance);
object message = new Object();
我们所创建的模拟订阅者(mockSubscriber)对象实现了 ISubscriber 接口,这样当测试中的对象调用其 ISubscriber 实例时,我们可以设置断言(assertions)。
下面我们来定义模拟的 ISubscriber 在测试运行过程中需要调用的方法的预期行为(expectations),我们希望 Receive 方法在调用时只传递一个参数——要发送的信息,因为返回值类型为空,因此不需要制定返回值。
mockSubscriber.Expect("Receive",message);
然后执行要测试的代码。
publisher.Publish(message);
最后我们来校验模拟的订阅者是否如我们所期望的被调用了。如果我们不进行校验,那么我们的测试代码将检测到对模拟订阅者的不正确调用,但是不是the complete lack of calls(抱歉不会翻译,原文是our test will detect incorrect calls to the mock Subscriber but not the complete lack of calls.)。
mockSubscriber.Verify();
下面是完整的测试代码:
using NMock;
using NUnit.Framework;
namespace sample.subscriber
{
[TestFixture]
public class PublisherTest
{
[Test]
public void OneSubscriberReceivesAMessage()
{
// set up
Mock mockSubscriber = new DynamicMock(typeof(ISubscriber));
Publisher publisher = new Publisher();
publisher.Add((ISubscriber) mockSubscriber.MockInstance);
object message = new Object();
// expectations
mockSubscriber.Expect("Receive",message);
// execute
publisher.Publish(message);
// verify
mockSubscriber.Verify();
}
}
}