Mock ใน dotnet core ด้วย Moq

ตอนทำ Unit Test โดยปกติก็จะตัด Dependency ออก เพื่อที่จะควบคุมพฤติกรรมของ Dependency ให้ได้ โดยการใช้ Test Double

ใน dotnet core มี Mock Framework ตัวนึงที่มีคนพูดถึงเยอะ ๆ ชื่อว่า Moq

ติดตั้ง Moq ผ่าน command line (อ้างอิงจาก https://www.nuget.org/packages/Moq/)

dotnet add package Moq --version 4.7.145

เมื่อติดตั้งเสร็จแล้วก็สามารถ using ไปใช้ได้เลย

ตอนเวลาสร้าง Mock เราก็แค่ new Mock และกำหนด Interface Type ของ class ที่จะ Mock หลังจากนั้นก็กำหนดพฤติกรรมมันว่าเมื่อมันทำอะไร จะให้ return อะไร เสร็จแล้วก็ inject ผ่าน Dependency Injection ไปได้เลย

using System;
using Xunit;
using RestServer.Controllers;
using Moq;
using RestServer.Services;
using RestServer.Models;
using Microsoft.AspNetCore.Mvc;

namespace RestServer.Tests
{
    public class CustomersControllerTest
    {
        [Fact]
        public void TestGetEmptyContentShouldReturnEmptyJsonArray()
        {
            var expected = new Customer[]{};
            var cs = new Mock<ICustomersService>();
            cs.Setup(o => o.All())
                  .Returns(new Customer[]{});
            CustomersController ctrl = new CustomersController(cs.Object);
            var result = ctrl.Get() as JsonResult;

            cs.Verify(o => o.All(), Times.Once());
            Assert.Equal(expected, result.Value);
        }
    }
}

สังเกตว่า ตัว Mock ที่สร้าง มัน Spy ให้ด้วย เราสามารถที่จะ verify call ได้ ผ่าน .Verify และใช้ Times เป็นตัวเช็คเรื่องจำนวนครั้ง

Leave a Reply