【发布时间】:2011-12-13 10:54:29
【问题描述】:
我们正在考虑将单元测试添加到我们的 C# 代码库中。我发现将单元测试添加到简单的类很容易,但与其他依赖项交互的类更加困难。我一直在研究模拟框架,但想知道首先编写类以打破外部依赖关系的最佳方法,例如文件系统、数据库和消息系统依赖关系。
举个例子,例程在套接字上侦听某种格式的消息——比如 MessageA。这被解码,一些计算完成,被重新编码成不同的二进制格式,然后发送结果消息,MessageB。
我目前的测试方法如下。我为所有套接字交互提取了一个接口,并创建了一个模拟接口。我将接口设置为单例。然后针对硬编码输入运行该类。被测类将使用单例中的接口发送/接收。
我做类似的事情来测试数据库交互。
这似乎不是最灵活的方法,您将如何改进它以使其更易于测试?如果一个模拟框架是答案,我将如何设计这些类?
示例代码:
[SetUp]
public void init()
{
// set message interface in singleton as mock interface
CommAdapter.Instance.MessageAdapter = new MockMessage();
// build reference message from hard coded test variables
initialiseMessageA();
// set input from mock message socket
((MockMessage) CommAdapter.Instance.MessageAdapter).MessageIn = m_messageA;
}
[Test]
public void test_listenMessage_validOutput()
{
// initialise test class
MessageSocket tS = new MessageSocket();
// read from socket
tS.listenMessage();
// extract mock interface from singleton
MockMessage mm = ((MockMessage) CommAdapter.Instance.MessageAdapter);
// assert sent message is in correct / correstpoinding format
Assert.AreEqual(1000001, mm.SentMessageB.TestField);
}
【问题讨论】:
-
Drexiya,如果你有时间,我强烈建议你阅读Growing Object-Oriented Software, Guided by Tests。这是一本 300 页,易于阅读的书(您可以在一个周末完成)。这是一本很好的书,描述了如何正确地进行单元测试,并讨论了很多关于如何使用模拟的内容。书中的代码示例是用 Java 编写的,但我相信您可以将抽象的想法应用到 C# 中,使用 moq 或类似的模拟库。
-
感谢奥古斯托的推荐,我一定会去看看那本书。
标签: c# unit-testing dependency-injection mocking