Mocking Unit Test Object Menggunakan NSubtitute

NSubtitute

http://nsubstitute.github.io/

Nsubtitute adalah salah satu mocking library untuk .NET yang memiliki configurasi yang sederhana sehingga mudah digunakan. NSubtitute di design untuk testing dengan pendekatan Arrange-Act-Assert (AAA), sehingga kita hanya butuh untuk mengatur bagaimana harusnya dia bekerja dan kemudian membuat pemanggilan Assertion.

Kita bisa menginstall NSubtitute lewat Packet Manager Console pada Visual Studio.

install-nsubtitute.png

Sebagai contoh kita akan membuat abstraksi operasi pada Calculator menggunakan interface.

public interface ICalculator
{
   int Add(int number1, int number2);
}

Kemudian kita mempunyai sebuah class yang menyediakan service untuk menampilkan hasil kalkulasi tersebut. Prinsip dasar unit test adalah melakukan test pada unit terkecil dari kode program kita dan mengisolasi extenal class yang ada.

Karena kita akan membuat unit test untuk class CalculatorService, sehingga external class berupa class implentasi dari ICalculator kita buatkan mockup nya saja.

public class CalculatorService
   {
       private ICalculator _calculator;
       public CalculatorService(ICalculator calculator)
       {
           _calculator = calculator;
       }
       public int Add(int number1, int number2)
       {
           if (number2 == 0)
           {
               throw new Exception("Dived by Zero Exception, please input number2 != 0");
           }
           var result = _calculator.Add(number1, number2);
           return result;
       }
   }

Setiap class Unit Test haruslah ditandai dengan attribute [TestClass] dan Unit Test Method dengan attribute [TestMethod].

[TestClass]
public class CalculatorServiceTest
{
    [TestMethod]
    public void Add_ReturnValidResult()
    {
    }
}

Jika kita menginginkan suatu proses tertentu yang harus dilakukan sebelum unit test method dijalankan seperti proses inisialisasi data, kita bisa membuat method dengan attribute [TestInitialize] dan sebalikanya jika kita menginginkan sebuah proses yang dieksekusi setiap sebuah unit test method di jalankan kita bisa membuta method dengan attribute [TestCleanup].

[TestInitialize]
public void Setup()
{

}
[TestCleanup]
public void Cleanup()
{
}

Jika Kita melakukan test terhadap expection yang mungkin ada, tambahkan attribute [ExpectedException].

[TestMethod]
[ExpectedException(typeof(Exception))]
public void Add_WhenNumber2IsZeroReturnException()
{
}

Untuk melakukan mockup object, cukup dengan menulis kode seperti ini. Usahakan implementasi yang kita buat selalu berawal dari abstraksi sehingga memudahkan menulis kode mockup objectnya.
csharp _calculator = Substitute.For();

Selanjutnya kita akan memockup method Add pada ICalculator seperti ini.
csharp _calculator.Add(1, 2).Returns(3);

Bentuk class unit test selengkapnya sepert ini.

[TestClass]
    public class CalculatorServiceTest
    {
        private ICalculator _calculator;
        private CalculatorService _calculatorService;

        [TestInitialize]
        public void Setup()
        {
            _calculator = Substitute.For<ICalculator>();
            _calculatorService = new CalculatorService(_calculator);
        }
        [TestCleanup]
        public void Cleanup()
        {
            _calculator = null;
            _calculatorService = null;
        }

        [TestMethod]
        public void Add_ReturnValidResult()
        {
            var expectedResult = 3;
            ///arrange
            _calculator.Add(1, 2).Returns(expectedResult);
            ///act
            var actualResult = _calculatorService.Add(1, 2);
            ///assert
            Assert.AreEqual(expectedResult, actualResult);
        }
        [TestMethod]
        [ExpectedException(typeof(Exception))]
        public void Add_WhenNumber2IsZeroReturnException()
        {
            try
            {
                _calculatorService.Add(1, 0);
                Assert.Fail();
            }
            catch(Exception ex)
            {
                Assert.IsInstanceOfType(ex, typeof(Exception));
                Assert.AreEqual("Dived by Zero Exception, please input number2 != 0", ex.Message);
                throw ex;

            }
           
        }
    }

 

Mari kita jalankan class unit test kita.

pass-unit-test

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s