Basit Bir Mock Framework Geliştirelim 2
2023-05-11
Artık interface lerle çalışalım.
Öncelikle, System.Reflection.DispatchProxy
‘yi kullanacağız. Bu, bir proxy sınıfı oluşturmanıza ve ona method çağrılarını yönlendirmenize olanak sağlar.
DispatchProxy
‘yi kullanarak belirli bir arayüzün metotlarını mocklayalım.
using System;
using System.Collections.Generic;
using System.Reflection;
public class Mock<T> : DispatchProxy
{
private readonly Dictionary<string, object> _methodResponses = new();
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
if (_methodResponses.TryGetValue(targetMethod.Name, out var value))
{
return value;
}
throw new Exception($"No response set up for method {targetMethod.Name}");
}
public void Setup(string methodName, object response)
{
if (_methodResponses.ContainsKey(methodName))
{
_methodResponses[methodName] = response;
}
else
{
_methodResponses.Add(methodName, response);
}
}
public static T Create()
{
return Create<T, Mock<T>>();
}
}
Bu örnekte, Setup
metodu belirli bir methodun yanıtını ayarlar. Daha sonra, Invoke
metodu çağrıldığında, belirli bir method için ayarlanan yanıtı döndürür.
Bunu aşağıdaki gibi kullanabiliriz:
public interface ITestInterface
{
string TestMethod();
}
public class Test
{
public void TestMethod()
{
var mock = Mock<ITestInterface>.Create();
(mock as Mock<ITestInterface>).Setup(nameof(ITestInterface.TestMethod), "Test response");
var result = mock.TestMethod();
Console.WriteLine(result); // Outputs: Test response
}
}
Bu örnekte, ITestInterface
arayüzünün TestMethod
metodunu mockluyoruz. TestMethod
çağrıldığında, “Test response” döndürülür.
Bu basit mocklama kütüphanesi, belirli bir arayüzün metotlarını mocklamak için kullanılabilir.