Art*_*his 6 c# unit-testing moq mocking
假设我有一个包含多个函数的普通类:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想单元测试我的第一个函数并"模拟"其他函数,int GetTotal(int myValue)并且int GetTotal(string myString),为了只测试main函数内的代码.我使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道最新的是最干净的方式,但我有很多函数一个接一个地调用自己,这样就可以编写很多类.
更新
模拟实施托马斯的回答:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
更新2
请参阅Gishu的答案,以便更全面地了解这个"问题".
当然!在Rhino Mocks中,您可以使用部分模拟来达到这个目的。创建一个新的模拟,如下所示:
var mock = MockRepository.GeneratePartialMock<MyClass>();
Run Code Online (Sandbox Code Playgroud)
然后你可以模拟或存根你不想调用的两个方法,如下所示:
mock.Stub(x => x.GetTotal(10)).Return(42);
Run Code Online (Sandbox Code Playgroud)
但它要求您的 GetTotal 方法是虚拟的。