情况是我们有一个插件接口。我们要确保接口具有验收标准中列出的方法,而没有其他方法。怎么办?目前使用 NUnit 和 Moq,但如果无法通过这些实现,请告知替代方案。
例如:
Public Interface IPlugin {
bool Start();
bool Stop();
}
我们有调用它们并接收返回值的测试,没问题。但是我们如何测试以确保 IPlugin 只有 Start 和 Stop 而没有像 Restart() 之类的其他东西?
情况是我们有一个插件接口。我们要确保接口具有验收标准中列出的方法,而没有其他方法。怎么办?目前使用 NUnit 和 Moq,但如果无法通过这些实现,请告知替代方案。
例如:
Public Interface IPlugin {
bool Start();
bool Stop();
}
我们有调用它们并接收返回值的测试,没问题。但是我们如何测试以确保 IPlugin 只有 Start 和 Stop 而没有像 Restart() 之类的其他东西?
使用反射,例如Type.GetMethods方法:
Type myType =(typeof(IPlugin));
// Get the public methods.
MethodInfo[] myArrayMethodInfo = myType.GetMethods();
Console.WriteLine("The number of public methods is {0}.", myArrayMethodInfo.Length);
如果IPlugin
是您定义的接口,则在您的程序集中,方法将在编译时已知。没有理由检查其他方法,因为接口本身具有已知的固定结构。
实现此接口的类应该可以自由地拥有任何其他所需的方法,这将是内部实现的一部分。和方法只需要履行您的合同Start()
。Stop()
如果您想验证您的界面没有被开发人员更改,您可以使用反射:
MethodInfo[] methods = typeof(IPlugin).GetMethods();
// Check that there are only 2 methods, with the names you desire
Assert.AreEqual(methods.Length, 2);
var allowedMethodNames = new[] {"Start", "Stop"};
if (!methods.All(m => allowedMethodNames.Contains(m.Name)))
{
// Method not contained in allowed names...
}
使用typeof(IPlugin).GetMethods()
, 并枚举单元测试中的结果列表。
与其为此使用自动化单元测试,不如使用您的源代码控制系统来限制非核心团队中的人员的访问,以检查对定义接口的文件的更改。
这超出了单元测试的范围。单元测试是关于测试单个公共方法/属性的行为。测试不应以任何方式规定测试功能的实现细节。