因此,我编写了一个小型的异步服务器,每次从网络收到消息时都会调用委托,并且在如何测试该类时遇到问题。我是新来测试,我已经做了我的第一次测试在JavaScript中使用TDD,现在我正在尝试做TDD C#。TDD在C#中测试服务/后台代码
我已经开始编写我的第一个测试,我想我想要一些静态工厂来构造对象,这样如果参数无效或无效,我可以在构造对象之前检查它们,所以我写了这个,做了第一轮红绿重构。
[TestMethod]
public void CreateShouldCreateAnInstanceWithValidParameters()
{
MessageReceivedCallback callback = delegate(Message message, TcpClient sender) {};
AsyncTcpServer server = AsyncTcpServer.Create(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 40400), callback);
Assert.IsTrue(server != null && server is AsyncTcpServer);
}
我认为迄今为止它(afaik)。
现在,我想我需要一些Start()和Stop()方法来在后台启动这个服务器,所以它们将是第一次启动一个线程的同步方法,用于从TcpListener读取一些代码直到我调用Stop()。
现在这里是问题,因为出现很多的问题,我好像还没有找到最佳的解决方案(或只是一个解决方案)的问题:
我怎么测试启动( )方法?我检查它是否创建了一个线程?或者,提供服务器状态是一个更好的主意,以IsRunning之类的属性的形式提供,并确保在Start()被调用为false之后,在Start()为true之后,然后在Stop()之后为假?
如果我测试IsRunning的值,如果我只是通过实现必要的代码来传递它会有点假(正如在几本书和教程中所说的那样,只实现必要的代码测试通行证)在调用完成后要更改的值,而不创建线程?我认为如果我创建线程,它将是未经测试的代码,因为我找不到一个正确的方法来测试线程是否被创建(我可以公开该类的线程成员,但我认为这将是丑陋而不是非常封装的类)。
那么,我做错了什么?我该怎么办?
那么,这样用户就不得不实例化每个组件,让服务器从ThreadedRunner到IRunnable的实现,不是吗?我希望用户只知道一个设置整个事物的类,比如AsyncTcpServer,但不是像你所建议的那样持有整个实现。我认为我可以让每个组件都分开,但每个组件都由这个单独的类实例化,因此用户不必担心它的依赖关系。这是可测试的吗?或者可能整个想法不是那么好? –
@AdriánPérez你可以做很多事情来使其更具可测性。通常,注入依赖关系更容易测试,这就是为什么IOC容器(比如ninject)如此流行,还可以通过具有带参数的构造函数,如果注入时使用依赖项,或者默认情况下创建依赖项(如果未实例化) ,或者调用工厂类来构造对象。在封装功能和允许测试之间有一个持续的平衡。通常,如果你沿着tdd路线走,你会得到更多的抽象。 – forsvarir
谢谢@forsvarir,我会看看IOC容器。我也喜欢工厂班的想法。 –