2

我有一堂课,里面有复杂的科学计算。它设置为仅允许用户创建正确实例化的案例。然而,为了正确测试代码,需要直接设置内部状态变量,因为参考文档在其测试用例中提供了这些数据。但是,如果操作不当,可能会使状态无效。

所以我必须有能力,一个成员函数,从单元测试程序中设置内部变量。但我想强烈劝阻普通用户不要调用这个函数。(是的,一个坚定的用户可以做任何事情......但我不想宣传有办法做错事。)

例如,如果能够告诉 Intellisense 不显示该功能,那就太好了。

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

我还有什么其他选择?

跟进

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

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

4

7 回答 7

14

您可以使用InternalsVisibleToAttribute将内部成员标记为对您的测试程序集可见。在这种情况下使用它似乎会发光,尽管它不是“朋友”。

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

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

    [assembly:InternalsVisibleTo("YourTestAssembly")]

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

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]
于 2008-10-03T16:31:34.130 回答
5

用这个属性装饰你的方法:

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

这将从 Intellisense 隐藏它。

编辑:

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

于 2008-10-03T16:33:03.317 回答
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,但我不认为你的意思是internal

于 2008-10-03T17:54:05.523 回答
3

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

于 2008-10-03T16:36:54.913 回答
1

您也可以使用反射。谷歌搜索出现了使用反射的单元测试私有方法

于 2008-10-03T17:53:32.077 回答
0

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

于 2008-10-03T16:32:50.070 回答
0

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

于 2008-10-03T16:42:26.743 回答