强制延迟初始化的 TDD 代码
TDD code to force lazy initialization
如果我要遵循测试驱动的开发周期,我必须始终先编写测试,然后再编写代码。但是,如果我有以下 class:
public class ServiceProvider : IServiceProvider
{
private readonly IService1 service1;
private readonly IService2 service2;
...
public ServiceProvider()
{
service1 = new Service1();
service2 = new Service2();
...
}
public IService1 Service1 { get { return service1; } }
public IService2 Service2 { get { return service2; } }
...
}
和一个只检查返回的实例不为空的测试:
[TestFixture]
public class ServiceProviderTest
{
[Test]
public void ServicesAreNotNull()
{
var serviceProviderUT = new ServiceProvider();
Assert.That(serviceProviderUT.Service1, Is.Not.Null);
Assert.That(serviceProviderUT.Service2, Is.Not.Null);
...
}
}
我如何编写一个测试,迫使我从那个 class 转到下一个?
public class ServiceProvider : IServiceProvider
{
private readonly Lazy<IService1> service1;
private readonly Lazy<IService2> service2;
...
public ServiceProvider()
{
service1 = new Lazy<IService1>(() => new Service1());
service2 = new Lazy<IService2>(() => new Service2());
...
}
public IService1 Service1 { get { return service1.Value; } }
public IService2 Service2 { get { return service2.Value; } }
...
}
你的测试不应该强迫你做一个特定的实现。它期望某种行为。对于单元测试,您的代码是一个黑盒,如果行为正确,则测试成功。在这种情况下,服务的实现是私有的,所以您的测试不应该担心它是如何实现的。如果 class 的接口没有改变,你应该有相同的单元测试。惰性初始化更像是一个代码审查项目。
如果我要遵循测试驱动的开发周期,我必须始终先编写测试,然后再编写代码。但是,如果我有以下 class:
public class ServiceProvider : IServiceProvider
{
private readonly IService1 service1;
private readonly IService2 service2;
...
public ServiceProvider()
{
service1 = new Service1();
service2 = new Service2();
...
}
public IService1 Service1 { get { return service1; } }
public IService2 Service2 { get { return service2; } }
...
}
和一个只检查返回的实例不为空的测试:
[TestFixture]
public class ServiceProviderTest
{
[Test]
public void ServicesAreNotNull()
{
var serviceProviderUT = new ServiceProvider();
Assert.That(serviceProviderUT.Service1, Is.Not.Null);
Assert.That(serviceProviderUT.Service2, Is.Not.Null);
...
}
}
我如何编写一个测试,迫使我从那个 class 转到下一个?
public class ServiceProvider : IServiceProvider
{
private readonly Lazy<IService1> service1;
private readonly Lazy<IService2> service2;
...
public ServiceProvider()
{
service1 = new Lazy<IService1>(() => new Service1());
service2 = new Lazy<IService2>(() => new Service2());
...
}
public IService1 Service1 { get { return service1.Value; } }
public IService2 Service2 { get { return service2.Value; } }
...
}
你的测试不应该强迫你做一个特定的实现。它期望某种行为。对于单元测试,您的代码是一个黑盒,如果行为正确,则测试成功。在这种情况下,服务的实现是私有的,所以您的测试不应该担心它是如何实现的。如果 class 的接口没有改变,你应该有相同的单元测试。惰性初始化更像是一个代码审查项目。