我们正在考虑为我们的C#代码库添加单元测试。我发现对于简单的类添加单元测试很容易,但是与其他依赖关系交互的类更加困难。我一直在寻找模拟框架,但是想知道在编写类以打破外部依赖项(如文件系统、数据库和消息系统依赖项)方面的最佳方法。
举个例子,一个程序在套接字上监听某种格式的消息 - 比如MessageA。这被解码,进行一些计算,然后重新编码为不同的二进制格式,然后发送结果消息,即MessageB。
我的当前测试方法如下。我提取了所有套接字交互的接口,并创建了一个模拟接口。我将接口设置为单例。然后使用硬编码输入运行类。正在测试的类将使用单例中的接口来发送/接收。
我用类似的方式测试数据库交互。
这似乎不是最灵活的方法,你如何改进这一点以使它更容易测试?如果模拟框架是答案,那么我应该如何设计这些类?
示例代码:
举个例子,一个程序在套接字上监听某种格式的消息 - 比如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);
}