Допустим, у меня есть простой класс с несколькими функциями:
public class MyClass
{
public int GetTotal(int myValue, string myString)
{
if (myValue > 10)
return GetTotal(myValue);
else
return GetTotal(myString);
}
public int GetTotal(int myValue)
{
return myValue * 25 / 12 + 156;
}
public int GetTotal(string myString)
{
return myString.Length * 25 / 48 + 27;
}
}
Я хотел бы провести модульное тестирование моей первой функции и «смоделировать» другие, int GetTotal(int myValue)
и int GetTotal(string myString)
, чтобы проверить только код внутри основной функции. Я использую Moq в качестве основы для насмешек. Существуют ли уловки, которые позволили бы мне получить код из функции, которую я хочу протестировать, и смоделировать внутренний вызов других функций? Или мне нужно вызвать второй объект, подобный этому, чтобы все высмеивать?
public class MyCalculator
{
public int GetTotal(int myValue)
{
return myValue * 25 / 12 + 156;
}
public int GetTotal(string myString)
{
return myString.Length * 25 / 48 + 27;
}
}
public class MyClass
{
MyCalculator _Calculator;
public MyClass(MyCalculator calculator) { _Calculator = calculator; }
public int GetTotal(int myValue, string myString)
{
if (myValue > 10)
return _Calculator.GetTotal(myValue);
else
return _Calculator.GetTotal(myString);
}
}
Я знаю, что последний является самым чистым способом, но у меня есть много функций, вызывающих себя одна за другой, так что можно было бы написать много классов.
Обновление
Ложная реализация ответа Томаса:
public class MyClass
{
public int GetTotal(int myValue, string myString)
{
if (myValue > 10)
return GetTotal(myValue);
else
return GetTotal(myString);
}
public virtual int GetTotal(int myValue)
{
return myValue * 25 / 12 + 156;
}
public virtual int GetTotal(string myString)
{
return myString.Length * 25 / 48 + 27;
}
}
[TestClass]
public class Test
{
[TestMethod]
public void MyClass_GetTotal()
{
Mock<MyClass> myMockedClass = new Mock<MyClass>() {CallBase = true};
myMockedClass.Setup(x => x.GetTotal(It.IsAny<int>())).Returns(1);
myMockedClass.Setup(x => x.GetTotal(It.IsAny<string>())).Returns(2);
var actual = myMockedClass.Object.GetTotal(0,string.Empty);
Assert.AreEqual(2,actual);
}
}
Обновление 2
См. Также ответ Гишу для более глобального взгляда на этот «вопрос».