隐藏功能
时间: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:我知道你说的是内部的,但我不认为你是说内部的。

