Нещодавно я обговорював з деякими друзями, який із наведених нижче способів найкраще заглушити результати повернення або виклики методів всередині одного класу від методів всередині одного класу.
Це дуже спрощений приклад. Насправді функції набагато складніші.
Приклад:
public class MyClass
{
public bool FunctionA()
{
return FunctionB() % 2 == 0;
}
protected int FunctionB()
{
return new Random().Next();
}
}
Тому для перевірки цього у нас є 2 методи.
Спосіб 1. Використовуйте функції та дії для заміни функціональності методів. Приклад:
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);
}
}
Спосіб 2: Зробіть учасників віртуальними, вивести клас та у похідному класі використовувати Функції та дії для заміни функціональності Приклад:
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);
}
}
Я хочу знати, що краще, а також ЧОМУ?
Оновлення: ПРИМІТКА. ФункціяB також може бути загальнодоступною
FunctionB
розбита по конструкції. new Random().Next()
майже завжди помиляється. Вам слід ввести екземпляр Random
. ( Random
це також погано розроблений клас, який може викликати кілька додаткових проблем)
FunctionA
повертає bool, але встановлює лише локальну зміннуx
і нічого не повертає.