使用FakeItEasy模拟私有方法

时间:2018-04-12 06:45:44

标签: unit-testing mstest fakeiteasy

我已经实现了使用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”)
  预计会发现它至少一次但没有对伪造物体进行过调用。

1 个答案:

答案 0 :(得分:1)

正如他们在评论中告诉你的那样,你不能轻易地测试私人方法,在绝大多数情况下,你可能不应该这样做。
如果由于某种原因,你仍然想要测试AddInetegers(),那么有一种“脏”方式可以隐藏某些信息并测试你的方法。

首先,你必须让AddInetegers内部;它在组装之外是不可见的,你可以测试它。

然后找到XYZ类所属的项目的Properties \ AssemblyInfo.cs文件;假设您的项目名为MyProject且测试项目为MyProjectTests,则可以添加

using System.Runtime.CompilerServices;

到AssemblyInfo.cs和

的顶部
[assembly: InternalsVisibleTo("MyProjectTests")]

到底部。这将使您的方法可测试。更多信息herehere

<小时/> 然后有一个更脏的方式,即保持你的方法私密;它被提及,例如herehere并且依赖于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非常详细地说明为什么你不应该测试私有方法和/或为什么那些你想要测试的方法不应该是私有的。
但它也解释了为什么你可能需要这样做:

  1. 当重构和/或添加测试到遗留系统时,您可能仍然没有时间熟悉
  2.   

    有时候测试私有功能是最安全的

    1. 当有人给你一个不合理的截止日期时
    2.   

      你很匆忙,必须在这里做最快的事情   现在。从长远来看,您不希望测试私有方法。但   我会说重构通常需要一些时间才能解决   设计问题。有时你必须在一周内发货。没关系:   做快速和脏,并使用摸索测试私人方法   工具,如果你认为这是最快和最可靠的方式   把工作做完。但要明白,你所做的事情并不理想   从长远来看,请考虑回到它(或者,如果它是   忘记了,但你稍后再看,修好它。)