gpt4 book ai didi

c# - 使用 Moq 进行单元测试

转载 作者:太空狗 更新时间:2023-10-29 21:41:37 25 4
gpt4 key购买 nike

假设我有一个具有多个函数的普通类:

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);
}
}

我知道最新的是最干净的方法,但我有很多函数一个接一个地调用自己,这样会产生很多类要编写。

更新

Thomas 答案的模拟实现:

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

另请参阅 Gishu 回答以更全面地了解此“问题”。

最佳答案

当然!在 Rhino Mocks您可以为此目的使用部分模拟。像这样创建一个新的模拟:

var mock = MockRepository.GeneratePartialMock<MyClass>();

然后你可以像这样模拟或 stub 这两个你不想调用的方法:

mock.Stub(x => x.GetTotal(10)).Return(42);

它要求您的 GetTotal 方法是虚拟的。

关于c# - 使用 Moq 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6262800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com