Geçenlerde bazı arkadaşlarla tartışarak geri dönüş sonuçlarını saptamak için en iyi olan aşağıdaki 2 yöntemden hangisinin aynı sınıf içindeki yöntemlerden aynı sınıf içindeki yöntemlere çağrı yapmaktan bahsediyordum.
Bu çok basitleştirilmiş bir örnek. Gerçekte, işlevler çok daha karmaşıktır.
Örnek:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionB()
{
return new Random().Next();
}
}
Bunu test etmek için 2 yöntemimiz var.
Yöntem 1: Yöntemlerin işlevselliğini değiştirmek için İşlevler ve İşlemler'i kullanın. Örnek:
public class MyClass
{
public Func<int> FunctionB { get; set; }
public MyClass()
{
FunctionB = FunctionBImpl;
}
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionBImpl()
{
return new Random().Next();
}
}
[TestClass]
public class MyClassTests
{
private MyClass _subject;
[TestInitialize]
public void Initialize()
{
_subject = new MyClass();
}
[TestMethod]
public void FunctionA_WhenNumberIsOdd_ReturnsTrue()
{
_subject.FunctionB = () => 1;
var result = _subject.FunctionA();
Assert.IsFalse(result);
}
}
Yöntem 2: Üyeleri sanal hale getirin, sınıfı türetin ve türetilmiş sınıfta işlevselliği değiştirmek için İşlevler ve Eylemler kullanın Örnek:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected virtual int FunctionB()
{
return new Random().Next();
}
}
public class TestableMyClass
{
public Func<int> FunctionBFunc { get; set; }
public MyClass()
{
FunctionBFunc = base.FunctionB;
}
protected override int FunctionB()
{
return FunctionBFunc();
}
}
[TestClass]
public class MyClassTests
{
private TestableMyClass _subject;
[TestInitialize]
public void Initialize()
{
_subject = new TestableMyClass();
}
[TestMethod]
public void FunctionA_WhenNumberIsOdd_ReturnsTrue()
{
_subject.FunctionBFunc = () => 1;
var result = _subject.FunctionA();
Assert.IsFalse(result);
}
}
Hangisinin daha iyi olduğunu ve niçin olduğunu bilmek istiyorum.
Güncelleme: NOT: FunctionB ayrıca herkese açık olabilir
FunctionB
tasarım tarafından bozuldu. new Random().Next()
neredeyse her zaman yanlış. Örneğini enjekte etmeniz gerekir Random
. ( Random
ayrıca birkaç ek soruna neden olabilen kötü tasarlanmış bir sınıftır)
FunctionA
bir bool döndürür, ancak yalnızca yerel bir değişken ayarlarx
ve hiçbir şey döndürmez.