首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FakeItEasy模拟私有方法

使用FakeItEasy模拟私有方法
EN

Stack Overflow用户
提问于 2018-04-12 06:45:43
回答 1查看 3.5K关注 0票数 2

我已经实现了使用FakeItEasy框架模拟测试公共虚拟方法的解决方案。下面我有一个带有私有方法的Test类,而私有方法不能是虚拟的。因此,请帮助我模拟使用FakeItEasy框架的私有方法

待测试的

代码语言:javascript
复制
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);
    }
}

测试类

代码语言:javascript
复制
[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") 预计至少会找到一次,但没有给这个假物体打电话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 20:00:00

正如他们在评论中告诉您的那样,您不能轻易地测试私有方法,在绝大多数情况下,您可能不应该这样做。

如果出于某种原因,您仍然希望测试AddInetegers(),那么就有一种“肮脏”的方法来隐藏某种信息并测试您的方法。

首先,您必须将AddInetegers设置为内部;它在程序集之外是不可见的,您将能够测试它。

然后查找您的Properties\AssemblyInfo.cs类所属的项目的XYZ文件;如果您的项目名为MyProject,而您的测试项目是MyProjectTests,则可以添加

代码语言:javascript
复制
using System.Runtime.CompilerServices;

到AssemblyInfo.cs的顶端

代码语言:javascript
复制
[assembly: InternalsVisibleTo("MyProjectTests")]

一直到底部。这将使您的方法可测试。更多信息,这里这里

还有一种更脏的方法,就是让你的方法保持私密性,比如这里这里,它依赖于PrivateObject,而PrivateObject自2004年起就已经存在了,就像James自己的这篇文章那样

代码语言:javascript
复制
var CurrentInstance = new XYZ();
var PrivateObject= new PrivateObject(CurrentInstance);
PrivateObject.Invoke("AddInetegers");

Assert.AreEqual(90, XYZ.nValue);

老实说,除非您正在处理非常复杂的遗留代码,否则您可能需要利用您的设计技能,并考虑一下为什么要测试一个私有方法,以及为什么它的作者决定让它私有。这个答案非常详细地解释了为什么不应该测试私有方法和/或为什么要测试的方法不应该是私有的。

但这也解释了为什么你可能需要这样做:

  1. 在对遗留系统进行重构和/或添加测试时,您可能还没有时间熟悉这些测试

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

  1. 当有人给你一个不合理的最后期限

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49789749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档