设置模式和TDD以一定间隔通过TCP发送消息

时间:2014-04-16 14:30:49

标签: c# .net tcp timer tdd

我正在尝试在我的最新项目中使用TDD,但是我一直试图实现这一点。

我需要每隔一段时间向TcpListener发送一条ping消息。我参考了这个question实现了一个TCP服务。到目前为止,TDD过程一切顺利。 TcpService由控制整个程序流程的引擎使用。

现在我需要每隔几秒发送一条消息。我的想法是创建另一个在内部使用计时器的服务,并向其注入TcpService,以便它能够通过TCP发送消息。

这是一个可行的解决方案吗?如果是这样,我该如何测试呢?如果没有,有人能指出我正确的方向吗?

感谢。

2 个答案:

答案 0 :(得分:2)

通常,良好的单元测试是短暂的,快速的,不包含逻辑,不涉及IO,测试单个事物,在单个对象上断言,独立且可靠。

被测试的单件被称为被测系统(SUT)。应该能够在测试期间配置SUT的所有依赖项。

尝试在单元测试中避免逻辑,IO和异步调用。这些往往会造成脆弱,不可靠和缓慢的测试。我发现Roy Osherove的videos是TDD和单元测试的良好起点。这是Roy Osherove对Unit Test的定义。

编写可测试代码需要一些时间来习惯。一个好的起点是鲍勃叔叔的SOLID原则。我发现单一责任原则(SRP),依赖性倒置原则(DIP)以及“不重复自己”(DRY)原则可以提供最佳里程。

专注于编写执行系统核心逻辑的单元测试,一次一小部分逻辑。您实际上并不想测试网络是否在单元测试中工作,但您确实希望测试连接两端的逻辑。

应避免在自动测试中使用计时器。你想要了解计时器内部的逻辑。定时器导致缓慢,不可靠的测试。

如果您真的想测试网络连接,那么您实际上是在编写integration test。没有什么可以说你不应该这样做,但是当你编写单元测试时,你的重点是核心逻辑。

您可能需要考虑使用模拟框架,例如Moq。这是关于Writing Unit Tests with NUnit and Moq的文章。您不需要使用模拟框架,因为您可以在单元测试中创建具体实例,但最好知道您有选项。

答案 1 :(得分:0)

创建ScheduledTask实现的接口TcpService。创建一个带有两个构造函数参数的Scheduler类:以毫秒为单位的间隔和ScheduledTask。现在,您可以使用1毫秒的间隔和模拟ScheduledTask为Scheduler编写单元测试。