如何测试以确保接口没有列出的其他方法?

时间:2013-07-09 19:01:50

标签: c# .net unit-testing testing

情况是我们有一个插件界面。我们希望确保接口具有验收标准中列出的方法,而不是其他方法。怎么会这样呢?目前正在使用NUnit和Moq,但如果无法实现这些,请提供有关替代方案的建议。

例如:

Public Interface IPlugin {
  bool Start();
  bool Stop();
}

我们有测试来调用它们并收到返回值,没问题。但是我们如何测试以确保IPlugin只有Start和Stop而没有其他像Restart()或其他东西?

5 个答案:

答案 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)

这超出了单元测试的范围。单元测试是关于测试单个公共方法/属性的行为。测试不应以任何方式规定测试功能的实现细节。