Birden çok katmanı olan bir uygulama üzerinde çalışıyorum. Veri kaynağından veri almak ve kaydetmek için veri erişim katmanı, verileri değiştirmek için iş mantığı, verileri ekranda göstermek için kullanıcı arayüzü.
Ayrıca iş mantığı katmanı üzerinde birim testi yapıyorum. Tek gereklilik, iş katmanı mantığının akışını test etmektir. Bu yüzden veri erişim katmanı ve birim mantık katmanı MS Unit ile test etmek için Moq framework kullanıyorum.
Birim testinin yapılabilmesi için tasarım ayrıştırmasını olabildiğince yapmak için arayüz programlaması kullanıyorum. İş katmanı arayüzü üzerinden veri erişim katmanı çağrısı.
İş mantığı yöntemlerinden birini test etmeye çalışırken bir sorunla karşılaşıyorum. Bu yöntem bazı işleri yapar ve bir nesne oluşturur ve bunu veri erişim katmanına iletir. Ben o veri erişim katmanı yöntemi alay etmeye çalıştığımda o zaman başarılı alay olamaz.
Burada sorunumu göstermek için bir demo kodu oluşturmaya çalışıyorum.
Model:
public class Employee
{
public string Name { get; set; }
}
Veri erişim katmanı:
public interface IDal
{
string GetMessage(Employee emp);
}
public class Dal : IDal
{
public string GetMessage(Employee emp)
{
// Doing some data source access work...
return string.Format("Hello {0}", emp.Name);
}
}
İş mantığı katmanı:
public interface IBll
{
string GetMessage();
}
public class Bll : IBll
{
private readonly IDal _dal;
public Bll(IDal dal)
{
_dal = dal;
}
public string GetMessage()
{
// Object creating inside business logic method.
Employee emp = new Employee();
string msg = _dal.GetMessage(emp);
return msg;
}
}
Ünite testi:
[TestMethod]
public void Is_GetMessage_Return_Proper_Result()
{
// Arrange.
Employee emp = new Employee; // New object.
Mock<IDal> mockDal = new Mock<IDal>();
mockDal.Setup(d => d.GetMessage(emp)).Returns("Hello " + emp.Name);
IBll bll = new Bll(mockDal.Object);
// Act.
// This will create another employee object inside the
// business logic method, which is different from the
// object which I have sent at the time of mocking.
string msg = bll.GetMessage();
// Assert.
Assert.AreEqual("Hello arnab", msg);
}
Alay sırasındaki birim test durumunda bir Employee nesnesi gönderiyorum ancak iş mantığı yöntemini çağırırken, yöntemin içinde farklı Employee nesnesi oluşturuyor. Bu yüzden nesneyi alay edemiyorum.
Bu durumda, sorunu çözebilmem için nasıl tasarım yapılır?