我有一个班级负责复杂的科学计算。它被设置为仅允许用户创建正确实例化的案例。但是,要正确测试代码,需要直接设置内部状态变量,因为参考文档在其测试用例中提供了这些数据。但是,如果做得不正确,它可能会使州无效。
所以我必须有能力,一个成员函数,从单元测试程序中设置内部变量。但我想强烈反对普通用户调用此函数。 (是的,一个坚定的用户可以捣乱任何东西......但我不想做广告有办法做某事错误。)
例如,能够告诉Intellisense不显示该功能会很高兴。
我目前最好的解决方案就是将函数命名为:DangerousSet()。
我还有其他选择吗?
后续
我发现David B的答案对我的情况最有用。谢谢!
Mufasa建议使用反射很好,但更难实现(对我而言)
克里斯关于使用装饰器的建议很好,但没有成功
BFree对XML的建议也很好,并且已经在使用,但并没有真正解决问题。
最后,BillTheLizard建议问题出现在源文档中,这不是我可以控制的。国际专家出版高度技术性的书籍和期刊文章供社区使用。他们没有满足我的特殊需求这一事实是生活中的事实。根本没有替代文件。
答案 0 :(得分:14)
您可以使用InternalsVisibleToAttribute将内部成员标记为对测试程序集可见。在这种情况下使用它似乎很闪耀,虽然它不是“朋友”。
标记DangerousSet
函数internal
而不是public
。
在包含DangerousSet
的项目的Properties \ AssemblyInfo.cs中:
[assembly:InternalsVisibleTo("YourTestAssembly")]
如果由于某种原因有两个测试程序集,则语法为:
[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会给他们一个很好的警告。