Basit Bir Mock Framework Geliştirelim 1
2023-05-11
Mocklama, testlerinizde belirli sınıfların veya metodların davranışlarını taklit etmek için kullanılır. Örneğin, bir veritabanı çağrısı yapmak yerine, bir mock veritabanı çağrısını simüle edebilirsiniz. Bu, testlerin daha hızlı çalışmasını sağlar ve testlerin bağımlılıklarını azaltır.
.NET’de birçok popüler mock kütüphanesi varken neden böyle bir şey yapalım ki. Sadece nasıl çalıştığını anlamak ve biraz pratik yapmak. Ve başlayalım
using System;
using System.Collections.Generic;
public interface IMock<T>
{
void When(Func<T, bool> predicate);
void ThenReturn(object response);
}
public class Mock<T> : IMock<T>
{
private Dictionary<Func<T, bool>, object> responses = new();
public void When(Func<T, bool> predicate)
{
if (!responses.ContainsKey(predicate))
{
responses.Add(predicate, null);
}
}
public void ThenReturn(object response)
{
var lastKey = new List<Func<T, bool>>(responses.Keys)[^1];
responses[lastKey] = response;
}
public object Handle(T input)
{
foreach (var pair in responses)
{
if (pair.Key(input))
{
return pair.Value;
}
}
throw new Exception("No matching response for input");
}
}
Bu basit mocklama kütüphanesi, belirli girdilere belirli yanıtlar verir. Örneğin, aşağıdaki gibi kullanılabilir:
var mock = new Mock<int>();
mock.When(x => x == 5).ThenReturn("Five");
mock.When(x => x == 10).ThenReturn("Ten");
Console.WriteLine(mock.Handle(5)); // Outputs: Five
Console.WriteLine(mock.Handle(10)); // Outputs: Ten
Bu örnekte, mock nesnesi 5 için “Five” ve 10 için “Ten” döndürür. Bu, belirli bir sınıfın veya metodun davranışını taklit etmek için kullanılabilir.