我已经实现了使用FakeItEasy框架模拟测试公共虚拟方法的解决方案。下面我有一个带有私有方法的Test类,而私有方法不能是虚拟的。因此,请帮助我模拟使用FakeItEasy框架的私有方法
待测试的类
public class XYZ
{
public static int nValue = 0;
private void AddInetegers()
{
int i = 3;
int j = i * 100;
int k = j * 30 / 100;
Show(String.Format("Value Here {0}", k.ToString()));
nValue = k;
}
public virtual void Show(string message)
{
MessageBox.Show(message);
}
}测试类
[TestMethod]
public void Test_Using_FakeItEasy()
{
var instance = A.Fake<XYZ>();
A.CallTo(() => instance.Show("Hello"));
//A.CallTo(() => instance.AddInetegers(3)).CallsBaseMethod();
A.CallTo(instance).Where(x => x.Method.Name.Contains("AddInetegers")).MustHaveHappened();
Assert.AreEqual(90, XYZ.nValue);
}错误:
结果消息:测试方法PrjMSTest.Test.Test_Using_FakeItEasy抛出异常: FakeItEasy.ExpectationException: 断言在以下调用中失败: 任何打给那个假物体的电话。 其中x => x.Method.Name.Contains("AddInetegers") 预计至少会找到一次,但没有给这个假物体打电话。
发布于 2018-04-13 20:00:00
正如他们在评论中告诉您的那样,您不能轻易地测试私有方法,在绝大多数情况下,您可能不应该这样做。
如果出于某种原因,您仍然希望测试AddInetegers(),那么就有一种“肮脏”的方法来隐藏某种信息并测试您的方法。
首先,您必须将AddInetegers设置为内部;它在程序集之外是不可见的,您将能够测试它。
然后查找您的Properties\AssemblyInfo.cs类所属的项目的XYZ文件;如果您的项目名为MyProject,而您的测试项目是MyProjectTests,则可以添加
using System.Runtime.CompilerServices;到AssemblyInfo.cs的顶端
[assembly: InternalsVisibleTo("MyProjectTests")]
还有一种更脏的方法,就是让你的方法保持私密性,比如这里或这里,它依赖于PrivateObject,而PrivateObject自2004年起就已经存在了,就像James自己的这篇文章那样
var CurrentInstance = new XYZ();
var PrivateObject= new PrivateObject(CurrentInstance);
PrivateObject.Invoke("AddInetegers");
Assert.AreEqual(90, XYZ.nValue);
老实说,除非您正在处理非常复杂的遗留代码,否则您可能需要利用您的设计技能,并考虑一下为什么要测试一个私有方法,以及为什么它的作者决定让它私有。这个答案非常详细地解释了为什么不应该测试私有方法和/或为什么要测试的方法不应该是私有的。
但这也解释了为什么你可能需要这样做:
有时候,仅仅测试私有功能是最安全的。
你现在很忙,必须现在就做最快的事情。从长远来看,您不希望测试私有方法。但我要说的是,重构通常需要一些时间来解决设计问题。有时候你得在一周内发货。这没关系:做快速和肮脏,并测试私人方法使用摸索工具,如果这是你认为是最快和最可靠的方式来完成这项工作。但是要明白,从长远来看,您所做的并不是最优的,请考虑回到它(或者,如果它被遗忘了,但您稍后会看到,修复它)。
https://stackoverflow.com/questions/49789749
复制相似问题