你会如何TDD或单元测试关闭NT服务的类/方法,如"telnet"?

NBP*_*C77 1 tdd unit-testing

单元测试和TDD的新手,我写了比传统LOB更多的OS实用程序.所以,我理解你如何模拟或存根数据库或文件,但是如下:

  • 针对Active Directory的身份验证
  • 停止NT服务
  • 对AD集团的授权
  • 等等...

bit*_*onk 5

您无法使用单元测试来测试服务是否实际停止.这就是其他测试(例如集成测试)的用途.通常值得测试,无论您是否正在测试系统(SUT)实际上正在进行正确的调用以停止服务.

在这种情况下,可以将这些具体的API包装到专门针对消费者需求的界面(façade)中.然后模拟该接口并声明您正在测试的消费者使用正确的参数调用了适当的成员.

示例(c#,NUnit,FakeItEasy):

// implementation of this interface basically wraps the concrete service APIs of the OS
public interface IServiceController
{
   public void Start(string serviceName);  
   public void Stop(string serviceName);
}    

// consumer that wants to stop a specific service and that is your SUT
public class SomeConsumer
{
    // ctor takes dependency on a service controller
    SomeConsumer(IServiceController controller)
    {
       // ...
    }

    public void DoSomethingThatRequiresAServiceStop()
    {
       // ...
    }
}

[TestFixture]
public class SomeConsumerTests
{
    [Test]
    public void DoSomethingThatRequiresAServiceStop_StopsServiceXYZ()
    {
          // arrange
          IServiceController mockServiceConntroler = A.Fake<IServiceController>();
          SomeConsumer sut = new SomeConsumer(mockServiceController);

         // act
         sut.DoSomethingThatRequiresAServiceStop();

         // assert
         A.CallTo(() => mockServiceConntroler.Stop("XYZ")).MustHaveHappend();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如Matt已经在某些环境中指出的那样,这些工具允许您替换具体实现而无需引入抽象(此处:) IServiceController.我倾向于尽可能地避免这些,因为它们通常不仅使用起来有点乏味,而且似乎也强制执行糟糕的设计选择(例如,取决于具体的实现而不是抽象).我看到像Microsoft Moles或TypeMock Isolator这样的工具更像是帮助你处理遗留代码库的工具,这些代码库已经有很多你无法摆脱的糟糕设计选择(马上).