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