2012-08-02 12 views
0

我需要单元测试一个方法,该方法接收MethodInfo某些任意用户代码方法(通过反射动态加载)的对象。单元测试接受MethodInfo对象的方法

public string SomeMethod(MethodInfo methodInfo); 

我想锻炼使用不同的MethodInfo对象此方法。

最简单的方法是使用<type>.GetMethod("name")检索MethodInfo对象,然后使用它调用测试方法并针对结果进行断言。

我想涵盖尽可能多的“不同”的方法信息(或更具体地说,尽可能多的不同方法传入)。

我正考虑2层的方法,不知道这是应该怎么做:

  1. 与我需要它的所有方法创建一个新的测试类。使用这种类型的GetMethods()并迭代它们以将它们馈送到我测试的方法中。

  2. 为每个方法创建一个单独的单元测试。

第一种选择是容易扩展(添加到测试类的新方法),但包含多个断言(断言针对它具有每个MethodInfo的实例)。

我们如何轻松解决此问题并为此特定场景创建稳健的测试?

+0

我想你想过度测试,你只需要测试所有的情况来覆盖你的整个代码(包括你的方法中调用的函数生成的异常)。除此之外,对所有不同方法类型的Dummy Class的方法进行迭代,你想测试似乎是一个好方法。 – 2012-08-02 22:27:35

+1

你准确地测试了什么? MethodInfo是从反射中获得的。测试的期望是什么?它坚持什么? – Ankush 2012-08-02 22:28:19

+0

我们的应用程序动态获取用户的方法,将其参数序列化为xml并显示它。我想确保无论在我们的应用程序中抛出哪种方法,它都会成功处理并在xml中显示其参数 – 2012-08-02 22:33:31

回答

1

用我需要的所有方法创建一个新的测试类。使用这种类型的 GetMethods()并迭代它们以将它们馈送到我测试的方法中。

如果SomeMethod逻辑(其处理此MethodInfo的)具有一般逻辑,其与所有类型的MethodInfo的交易,然后上述路线去了。

为每个方法创建一个单独的单元测试。

如果SomeMethod中的逻辑对各种类型的MethodInfo有特定的逐个逻辑,则按上述路由进行。

+0

第一个选项的唯一问题是它包含多个断言。这意味着测试将在第一次断言失败时失败,并且不会显示所有可能的失败情况。此外,通过测试名称(与名称中包含确切场景的测试相反),很难弄清楚测试名称有什么问题。 – 2012-08-02 22:40:53

+0

是的,的确如此。但那不是我的观点。这是“SomeMethod”的内部实现来控制选择。 – Ankush 2012-08-02 22:42:47

+0

SomeMethod并不关心您输入的MethodInfo类型。这是一种支持任何类型对象的通用方法。 – 2012-08-02 22:46:06