iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Software Development

單元測試從入門到進階之路 (以 C# NUnit 3 X NSubstitute 為例)系列 第 16

Day 16-隔離框架 (isolation Framework) - NSubstitute 基本介紹 (核心技術-8)

  • 分享至 

  • xImage
  •  

NSubstitute 基本介紹與安裝

NSubstitute(簡稱 NSub)是一套友善的 .NET 隔離框架套件,讓開法者以簡單、乾淨的語法撰寫測試,這套框架是採用 3A 原則 (Arrange-Act-Assert) 和測試驅動開發(Test Driven Development, TDD)為核心設計出來的套件(翻譯自 NSubstitute 在 Nuget 的介紹)。雖然這邊是以 NSubstitute 為範例,但這邊所撰寫的邏輯也大都適用於其他的隔離框架如 Moq、FakeItEasy、NSubstitute、Typemock Isolator 與 JustMock。

那接下來介紹如何在測試專案上安裝 NSubstitute,其截圖如下(以 Visual Studio For Mac 為例):

  1. 點開 NuGet

https://ithelp.ithome.com.tw/upload/images/20210916/20127378jYJdV1C7mK.png

  1. 點選 NSubstitute 並安裝

https://ithelp.ithome.com.tw/upload/images/20210916/20127378nOc6RV3fjS.png


NSubstitute 基本語法 (以虛設常式為例)

那介紹 NSubstitute 語法之前,我們先簡單回顧 Day-10 所寫的商業邏輯、假物件與測試,如下:

此段為建置 Email 通知系統的商業邏輯與介面:

public class EmailSystem
{
    private IEmailService EmailService;

    public EmailSystem(IEmailService inEmailService)
    {
        EmailService = inEmailService;
    }

    public string EmailFunction(string mailAddress, string mailMessage)
    {
        var SendResult = EmailService
                        .SendEmail(mailAddress, mailMessage);

        return SendResult;
    }
}

public interface IEmailService()
{
    public string SendEmail(mailAddress, mailMessage);
}

而此段為建置 Email 通知系統的測試與虛設常式:

using NUnit3;

[TestFixture]
public class EmailSystemUnitTests
{
    [Test]
    public void EmailFunction_Success()
    {
        // Arrange
        StubEmailSerivce stubEmailService = new StubEmailSerivce();
        
        EmailSystem EmailService = new EmailSystem(stubEmailService);
        
        // Act
        var stubResult = EmailSystem
                        .EmailFunction("Test@abc.com.tw", "Test Demo");
        
        // Assert
        Assert.AreEqual("Success", stubResult);
    }
}

public class StubEmailSerivce : IEmailService
{
    public string SendEmail(EmailAddress, EmailMessage)
    {
        return "Success";
    }
}

在這邊我們手刻了一個 StubEmailSerivce 的虛設常式,做為 IEmailService 的實作;倘若今天用 NSub,則程式碼如下:

using NUnit3;

[TestFixture]
public class EmailSystemUnitTests
{
    [Test]
    public void EmailFunction_Success()
    {
        // Arrange
        IEmailService stubEmailService = Substitute.For<IEmailService>();
        
        stubEmailService.SendEmail("Test@abc.com.tw", "Test Demo").Returns("Success");
        
        EmailSystem EmailService = new EmailSystem(stubEmailService);
        
        // Act
        var stubResult = EmailSystem
                        .EmailFunction("Test@abc.com.tw", "Test Demo");
        
        // Assert
        Assert.AreEqual("Success", stubResult);
    }
}

上述的過程中,NSub 新增虛設常式做了兩個步驟:

  1. NSub 要新增假物件的基本語法:var substitute = Substitute.For();
  2. NSub 新增的假物件設定行為,如 Received()、Returns()、Arg.Is()、Arg.Any() 或 When()..Do()(本範例以 Returns() 為例)
  3. Returns 內撰寫預期的結果(本範例是 Success)

這樣子,Day-10 的手刻的物件就改成了 NSub 的寫法,接下來會開始介紹 NSub 的一些基本用法。


上一篇
Day 15-隔離框架 (isolation Framework) - 概念基本介紹 (核心技術-7)
下一篇
Day 17-隔離框架 (isolation Framework) - NSubstitute 基本介紹-2 (核心技術-9)
系列文
單元測試從入門到進階之路 (以 C# NUnit 3 X NSubstitute 為例)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言