隐藏功能

时间:2020-03-06 15:05:08  来源:igfitidea点击:

解决方案

我们可以使用InternalsVisibleToAttribute将内部成员标记为对测试程序可见。在此上下文中使用时,它似乎闪闪发光,尽管它不是完全的"朋友"。

  • 标记你的DangerousSet函数internal而不是public
  • 在包含DangerousSet的项目的Properties \ AssemblyInfo.cs中:[assembly:InternalsVisibleTo(" YourTestAssembly")]

如果出于任何原因有两个测试程序集,则语法为:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

测试代码可以包括计算类的子类吗?如果是这样,我们可以将功能标记为"保护",只有继承者才能使用它。我很确定这也会使它失去智能,但是我对此可能是错误的。

使用以下属性装饰方法:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

这将从Intellisense中将其隐藏。

编辑:

但这显然有一个相当重要的警告:"在Visual C#中,EditorBrowsableAttribute不会禁止来自同一程序集中的类的成员。"通过MSDN。

听起来真正问题在参考文件中。我们不应该测试在正确使用类的情况下不可能遇到的案例。如果不允许用户更改这些变量的状态,那么测试也不应更改。

过去我所做的是,我将XML注释放在该方法旁边,并使用该部分以粗体显示大写字母。请勿使用此方法或者其他方法。这样,如果有人尝试使用它,Intellisense会给他们一个很好的警告。

我们也可以使用反射。 Google搜索启用了使用反射的单元测试私有方法。

假设我们要通过操纵其字段来测试该对象。

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

将此对象放在测试程序集/命名空间中:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

并编写测试:

public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

PS:我知道你说的是内部的,但我不认为你是说内部的。