情况是我们有一个插件界面。我们希望确保接口具有验收标准中列出的方法,而不是其他方法。怎么会这样呢?目前正在使用NUnit和Moq,但如果无法实现这些,请提供有关替代方案的建议。
例如:
Public Interface IPlugin {
bool Start();
bool Stop();
}
我们有测试来调用它们并收到返回值,没问题。但是我们如何测试以确保IPlugin只有Start和Stop而没有其他像Restart()或其他东西?
答案 0 :(得分:4)
使用reflection,例如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);
答案 1 :(得分:3)
如果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...
}
答案 2 :(得分:3)
使用typeof(IPlugin).GetMethods()
,并枚举结果列表
在你的单元测试中。
答案 3 :(得分:2)
不要使用自动单元测试,只需使用源代码管理系统来限制非核心团队中的访问,以检查对定义接口的文件的更改。
答案 4 :(得分:1)
这超出了单元测试的范围。单元测试是关于测试单个公共方法/属性的行为。测试不应以任何方式规定测试功能的实现细节。