Day 16-隔离框架 (isolation Framework) - NSubstitute 基本介绍 (核心技术-8)

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("[email protected]", "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("[email protected]", "Test Demo").Returns("Success");
        
        EmailSystem EmailService = new EmailSystem(stubEmailService);
        
        // Act
        var stubResult = EmailSystem
                        .EmailFunction("[email protected]", "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 的一些基本用法。


<<:  110/01 - 什麽!startActivityForResult 被标记弃用?

>>:  【把玩Azure DevOps】Day4 版本控制系统Repos:初探Git Repo

Day11 - Bmo 眼睛嘴巴动起来

设定 BMO 初始化、更新要更新什麽、画出 BMO 的方法 class Bmo { constru...

[Day13]PHP 匿名函式及箭头函式

PHP函数 匿名函数 匿名函数(Anonymous functions),也称作闭包函数(closu...

Day-22 更加灵活的神经网路,我们可以做哪些变化

今天我们来还债 XDD,还之前跳过的很多解释,还有如何更加灵活的调整神经网路 那就让我们一步一步来...

D15 下载功能测试

一样先确认使用者在文件库有哪些文件 确认传送来的文件doc_id是属於使用者 确认文件存在後回传Ht...

危险气息的研究室:尾递回 Tail Calls

研究生和大学生不同,跟着指导的教授有着独立的研究室,以滞留时间来看,可说是研究生的第二个家。 「呐,...