【问题标题】:TDD code to force lazy initializationTDD 代码强制延迟初始化
【发布时间】:2016-06-10 08:27:52
【问题描述】:

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

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);
        ...
    }
}

我如何编写一个测试,迫使我从那个班级转到下一个班级?

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; } }
    ...
}

【问题讨论】:

    标签: c# tdd lazy-initialization


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但您谈论的是行为,所以我想知道您的回答是否可能与 BDD 而不是 TDD 相关(我仍在尝试找出它们之间的差异)。你是说测试一个变量是否被延迟初始化没有意义?
    • 嗯,在某些情况下,您可能想要验证是否有某些事情是懒惰的 示例可能是检查是否使用了yield return
    • BDD 是不同的东西。 BDD 是关于规范是给定形式的。 Given... When... Than... 我们不会在 TDD 中测试私有的东西,因为我们不想依赖于实现细节
    • @CarlosAlejo 重点是您正在测试一个接口。如果界面保持不变,则测试不应更改。您正在使用延迟初始化只是一个实现细节。
    • 那么,如果我们回到 TDD 循环(编写测试、失败、编写代码、通过、重构),是否让变量延迟初始化的决定将在“重构”步骤中?
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2012-09-03
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多