簡體   English   中英

TDD代碼強制延遲初始化

[英]TDD code to force lazy initialization

如果要遵循測試驅動的開發周期,則必須始終先編寫測試,然后再編寫代碼。 但是,如果我有以下課程:

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

您的測試不應強迫您執行特定的實現。 它期望某種行為。 對於單元測試,您的代碼是黑盒,如果行為正確,則測試成功。 在這種情況下,服務的實現是私有的,因此您的測試無需擔心其實現方式。 如果類的界面未更改,則應該具有相同的單元測試。 延遲初始化更多是代碼審查項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM