隐藏一个功能

时间:2008-10-03 16:30:27

标签: c# visual-studio intellisense

我有一个班级负责复杂的科学计算。它被设置为仅允许用户创建正确实例化的案例。但是,要正确测试代码,需要直接设置内部状态变量,因为参考文档在其测试用例中提供了这些数据。但是,如果做得不正确,它可能会使州无效。

所以我必须有能力,一个成员函数,从单元测试程序中设置内部变量。但我想强烈反对普通用户调用此函数。 (是的,一个坚定的用户可以捣乱任何东西......但我不想做广告有办法做某事错误。)

例如,能够告诉Intellisense不显示该功能会很高兴。

我目前最好的解决方案就是将函数命名为:DangerousSet()。

我还有其他选择吗?

后续

我发现David B的答案对我的情况最有用。谢谢!
Mufasa建议使用反射很好,但更难实现(对我而言) 克里斯关于使用装饰器的建议很好,但没有成功 BFree对XML的建议也很好,并且已经在使用,但并没有真正解决问题。

最后,BillTheLizard建议问题出现在源文档中,这不是我可以控制的。国际专家出版高度技术性的书籍和期刊文章供社区使用。他们没有满足我的特殊需求这一事实是生活中的事实。根本没有替代文件。

7 个答案:

答案 0 :(得分:14)

您可以使用InternalsVisibleToAttribute将内部成员标记为对测试程序集可见。在这种情况下使用它似乎很闪耀,虽然它不是“朋友”。

  1. 标记DangerousSet函数internal而不是public

  2. 在包含DangerousSet的项目的Properties \ AssemblyInfo.cs中:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

  3. 如果由于某种原因有两个测试程序集,则语法为:

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

答案 1 :(得分:5)

使用此属性装饰您的方法:

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

这会将其隐藏在Intellisense中。

编辑:

但显然这有一个相当重要的警告:“在Visual C#中,EditorBrowsableAttribute不会抑制同一程序集中某个类的成员。” Via MSDN

答案 2 :(得分:4)

假设您想通过操纵其字段来测试此对象。

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:我知道你说内部,但我不认为你的意思是internal

答案 3 :(得分:3)

听起来您的真实问题在于您的参考文档。您不应该测试在正确使用课程时无法遇到的案例。如果不允许用户更改这些变量的状态,那么您的测试也不应该。

答案 4 :(得分:1)

您也可以使用反射。谷歌搜索出现Unit testing private methods using reflection

答案 5 :(得分:0)

您的测试代码可以包含计算类的子类吗?如果是这样,您可以标记函数protected,只有继承者才能使用它。我很确定这也是出于智能感知,但我可能错了。

答案 6 :(得分:0)

我过去所做的是通过该方法输入XML Comments并使用该部分以粗体字母书写。不要使用这种方法或其他任何方法。这样,如果有人试图使用它,Intellisense会给他们一个很好的警告。