我已经实现了使用FakeItEasy Framework模拟测试公共虚拟方法的解决方案。下面我有一个带有Private方法的Test类,而private方法不能是虚方法。所以请帮我模拟使用FakeItEasy Framework的私有方法
要测试的课程
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 =&gt; x.Method.Name.Contains( “AddInetegers”)
预计会发现它至少一次但没有对伪造物体进行过调用。
答案 0 :(得分:1)
正如他们在评论中告诉你的那样,你不能轻易地测试私人方法,在绝大多数情况下,你可能不应该这样做。
如果由于某种原因,你仍然想要测试AddInetegers()
,那么有一种“脏”方式可以隐藏某些信息并测试你的方法。
首先,你必须让AddInetegers
内部;它在组装之外是不可见的,你可以测试它。
然后找到XYZ
类所属的项目的Properties \ AssemblyInfo.cs文件;假设您的项目名为MyProject
且测试项目为MyProjectTests
,则可以添加
using System.Runtime.CompilerServices;
到AssemblyInfo.cs和
的顶部[assembly: InternalsVisibleTo("MyProjectTests")]
<小时/> 然后有一个更脏的方式,即保持你的方法私密;它被提及,例如here或here并且依赖于
PrivateObject
,自2004年以来{James}每个this article由James Newkirk自己
var CurrentInstance = new XYZ();
var PrivateObject= new PrivateObject(CurrentInstance);
PrivateObject.Invoke("AddInetegers");
Assert.AreEqual(90, XYZ.nValue);
<小时/> 老实说,除非你处理非常复杂的遗留代码,否则你可能想要利用你的设计技巧,想一想你为什么要测试一个私有方法,以及为什么它的作者决定将它私有化。 This answer非常详细地说明为什么你不应该测试私有方法和/或为什么那些你想要测试的方法不应该是私有的。
有时候测试私有功能是最安全的
你很匆忙,必须在这里做最快的事情 现在。从长远来看,您不希望测试私有方法。但 我会说重构通常需要一些时间才能解决 设计问题。有时你必须在一周内发货。没关系: 做快速和脏,并使用摸索测试私人方法 工具,如果你认为这是最快和最可靠的方式 把工作做完。但要明白,你所做的事情并不理想 从长远来看,请考虑回到它(或者,如果它是 忘记了,但你稍后再看,修好它。)