C# 强制延迟初始化的TDD代码

C# 强制延迟初始化的TDD代码,c#,tdd,lazy-initialization,C#,Tdd,Lazy Initialization,如果我要遵循测试驱动的开发周期,我必须总是先编写测试,然后再编写代码。但是,如果我有以下课程: public class ServiceProvider : IServiceProvider { private readonly IService1 service1; private readonly IService2 service2; ... public ServiceProvider() { service1 = new Ser

如果我要遵循测试驱动的开发周期,我必须总是先编写测试,然后再编写代码。但是,如果我有以下课程:

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; } }
    ...
}
以及只检查返回的实例是否为null的测试:

[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);
        ...
    }
}
我如何编写一个测试,迫使我从那个类转到下一个类

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; } }
    ...
}
公共类服务提供者:IServiceProvider
{
私有只读惰性服务1;
私有只读惰性服务2;
...
公共服务提供者()
{
service1=newlazy(()=>newservice1());
service2=newlazy(()=>newservice2());
...
}
public IService1 Service1{get{return Service1.Value;}}
public IService2 Service2{get{return Service2.Value;}}
...
}

您的测试不应强制您执行特定的实现。它期待某种行为。对于单元测试,您的代码是一个黑盒,如果行为正确,测试就会成功。在这种情况下,服务的实现是私有的,因此您的测试不应该担心它是如何实现的。如果一个类的接口没有改变,你应该有相同的单元测试。惰性初始化更像是一个代码审查项目。

谢谢您的回答,但您谈到了行为,所以我想知道您的回答是否与BDD而不是TDD有关(我仍在努力寻找它们之间的差异)。你是说测试一个变量是否被延迟初始化是没有意义的吗?在某些情况下,你可能想验证某件事是否完成了。例如,检查是否使用了
收益率返回值
。BDD是不同的事情。BDD是关于给定形式的规范。鉴于什么时候比我们不在TDD中测试私有内容,因为我们不想依赖于实现details@CarlosAlejo关键是您正在测试一个接口。如果接口保持不变,则测试不应更改。您正在使用延迟初始化只是一个实现细节。因此,如果我们返回到TDD周期(写测试、失败、写代码、通过、重构),那么在“重构”步骤中决定延迟初始化变量?