0

情况是我们有一个插件接口。我们要确保接口具有验收标准中列出的方法,而没有其他方法。怎么办?目前使用 NUnit 和 Moq,但如果无法通过这些实现,请告知替代方案。

例如:

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

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

4

5 回答 5

4

使用反射,例如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);
于 2013-07-09T19:05:56.853 回答
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...
}
于 2013-07-09T19:04:53.090 回答
3

使用typeof(IPlugin).GetMethods(), 并枚举单元测试中的结果列表。

于 2013-07-09T19:06:30.197 回答
2

与其为此使用自动化单元测试,不如使用您的源代码控制系统来限制非核心团队中的人员的访问,以检查对定义接口的文件的更改。

于 2013-07-09T19:15:31.270 回答
1

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

于 2013-07-09T19:05:31.313 回答