Strict Mock

Birim Testleri - Strict Mock

Moq kütüphanesinin Mock sınıfları oluşturulurken varsayılan davranış şekli Loose'dur. Bu şekilde tanımlanan mock nesneleri metot çağrıları için kurulum zorunluluğu dayatmaz.

var loggingService = new Mock<ILoggingService>();
var loggingService = new Mock<ILoggingService>(MockBehavior.Loose);

Strict Mock bir mock nesnenin çalışması için setup işleminin yapılmasını zorunlu kılar.

var loggingService = new Mock<ILoggingService>(MockBehavior.Strict);

Yararlar

Bu kullanım aşağıdaki yararlara sahiptir:

1. Doğrulanması unutulan metot çağrılarını (Verify) tespit eder.

  • void metotların çalışıp çalışmadığı kontrol edilmelidir.

  • Strict Mock kullanılmadığı durumlarda bu kontrol ancak Verify çağrısı ile sağlanır.

  • Assert bölümünde Verify çağrısı unutulursa test edilen metodun tüm davranışları test edilmemiş olur.

  • Strict Mock her çağrılan mock nesne metodunun setup'ını zorunlu kıldığından bu metotların da setupları yapılır.

  • Setup'ı yapılıp çalışmayan mock nesne metodu aşağıdaki hatayı oluşturur.

Moq.MockException : Mock<ISecurityService:1>:
This mock failed verification due to the following:

   ISecurityService x => x.Encrypt():
   This setup was not matched.
  • Çalıştığı doğrulanmak istenen metot kurulumu için Verifiable() olarak işaretlenir.

  • Metotlarının kurulumları yapılan mock nesne Assert bölümünde Verify() metodu çağrısı ile doğrulanmalıdır.

  • Metotların kurulumunda Verifiable çağrısı yapılmadan, mock nesnenin tüm çağrılarının (Verifiable veya değil) doğrulamasını sağlamak için VerifyAll() metodu kullanılır. (Önerilen pratik budur)

2. Çalışmaması gereken metot çağrılarını tespit eder.

  • Çağrılan her metodun setup'ı yapılmalıdır.

  • Setup'ı yapılmayan bir metot çağrıldığında aşağıdaki hata alınır:

3. Assert bölümlerinde Verify işlemleri sadeleşir

  • Verify edilmesi gereken metotların kurulumları da Arrange bölümünde yapıldığından Assert bölümün daha sade ve anlaşılır hale gelir.

4. Metodun fazla sorumluluğu varsa bunu önplana çıkarır Doğrulanması gereken çağrılar için setup gerektiğinden, setup'ın ve test edilen metodun büyüklüğü gözle görülür hale gelir.

  • Büyük bir test kurulum bölümü, test edilen metodun gerektiğinden fazla sorumluluğa sahip olduğunun ve yeterince soyutlama yapılmadığının göstergesidir.

  • Extract Class veya Move Method yöntemleri uygulanabilir.

Uygulama Örneği

TestFixture sınıfları Foo.Framework.UnitTests v2.0 nuget paketinde bulunan BaseTestFixture sınıfından türetilir.

BaseTextFixture sınıfı

Örnek TestFixture tanımı

Testlerde kullanılan mock member bileşenleri aynı pakette bulunan StrictMock tipinde tanımlanır.

Örnek Setup metodu

BaseTestFixture sınıfı her testten sonra çalışmak üzere TearDown metodunu içerir ve bu metotta VerifyMocks metodu çağrılır. BaseTestFixture sınıfında bulunan abstract VerifyMocks metodu implemente edilir ve TestFixture'da bulunan tüm mock memberlar için VerifyAll metodu çağrılır. Bu metot bir mock için yapılan setup işlemi Verifable olarak işaretlenip işaretlenmeme durumuna bakmaksızın mock nesne için Verify işlemini uygular.

Örnek VerifyMocks implementasyonu

Testlerde Arrange bölümünde setup işlemlerini Verifiable olarak işaretlemek ve Assert bölümünde mocklar için Verify veya VerifyAll çağrısı yapmaya gerek yoktur.

Örnek Test

Mock member içermeyen TestFixture sınıfları

Mock member içermeyen TestFixture sınıflarında mock Verify işlemine gerek olmadığından bu sınıflar BaseTestFixture yerine LooseBaseTestFixture sınıfından türetilirler. Bu sınıf bir TearDown metodu ve abstract VerifyMocks metodu içermez.

Örnek Mock içermeyen TestFixture

Last updated

Was this helpful?