Tag

,

Dalam Behaviour-Driven Development (BDD) kita memulai dengan sebuah sekenario yang hidup dalam sebuah konteks. Lalu test dilakukan terhadap konteks itu.

Contoh, ketika Employee mengkonsumsi pesan UbahStatusPerkawinan maka jumlah yang tidak terkena pajak menjadi 10 juta.

Disini konteksnya adalah kita telah memiliki karyawan yang belum kawin, bujang. Nah, test kita lakukan ketika terjadi perubahan.

Jika menggunakan NUnit kita biasanya akan menulis code berikut

Assert.AreEqual(10.000.000, karyawan.PTKP);

Dengan dotnet extention kita bisa membuat sedemikian hingga lebih intuitif dan berkarakter BDD:

karyawan.PTKP.ShouldEqual(10.000.000);

“ShouldEqual” disini adalah method yang tidak ada dalam kelas Karyawan, ia adalah method extention. Bagaimana method extention dibuat?

Pertama, buatlah kelas static katakanlah bernama: BddExtentions.

Kedua, buatlah method static. Contoh:

public static void ShouldEqual<T>(this T actual, T expected)

Perhatikanlah this disitu, ia menacu pada nilai/variabel yang akan dilekati. Disini kita mencoba membandingkan dua tipe T yang sama (tentu saja harus sama). Lengkapnya kelas itu seperti ini:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace Fatur.Exp.ExtentionMethod
{
    public static class BddExtentions
    {
        public static void ShouldEqual<T>(this T actual, T expected)
        {
              Assert.AreEqual(expected, actual);
        }
    }
}

Dan contoh kelas test-nya seperti berikut ini:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace Fatur.Exp.ExtentionMethod
{
[TestFixture]
public class KetikaKaryawanMasihSingle
{
    IKaryawan karyawan;
    [SetUp]
    public void InitContext()
    {
        karyawan = new Karyawan("Fatur", "S");
    }
    [Test]
    public void PTKPHarusSejutaSetelahKawin()
    {
         var message = new UbahStatusKawin() { Status = "M" };
         karyawan.Consume(message);

         karyawan.PTKP.ShouldEqual(10000000);
    }
}
public class UbahStatusKawin
{
     public string Status {get;set;}
}
public interface IKaryawan
{
    decimal PTKP { get; }

    void Consume(UbahStatusKawin message);
}
public class Karyawan : IKaryawan
{
    string m_nama;
    string m_status;
    public Karyawan(string nama, string status)
    {
        m_nama = nama;
        m_status = status;
    }

    public decimal PTKP
    {
        get {

              if (m_status.Equals("S"))
                  return 1000000;
              else if (m_status.Equals("M"))
                  return 10000000;
              else
                   return 0;
          }
    }
   public void Consume(UbahStatusKawin message)
   {
            this.m_status = message.Status;
   }

 }
 }

Keterangan lebih lanjut bagaimana hal ini bekerja lihat Using Extentions Method

Iklan