你如何测试采用枚举的方法

时间:2009-01-30 01:32:11

标签: c# unit-testing mocking

我已经为此功能进行了测试设置,但我想知道这是否是最好的方法。我有这样的方法:

public static string RunTableInfoCommand(IMapinfoWrapper wrapper,
                                         TableInfoEnum infoToReturn)
{
  //pass the int value of infoToReturn to underlying COM object eg wrapper.
}

TableInfoEnum看起来像这样(缩短版本):

public enum TableInfoEnum
{
   TAB_INFO_NAME = 1,
   TAB_INFO_NUM = 2,
   TAB_INFO_TYPE = 3,
   TAB_INFO_NCOLS = 4,
   TAB_INFO_MAPPABLE = 5,
   TAB_INFO_READONLY = 6,
   TAB_INFO_TEMP = 7
 }

当我将枚举传递给COM对象时,它将根据枚举值返回不同的字符串结果。 例如

TAB_INFO_NAME = "Water_Mains"
TAB_INFO_NUM = "1"

COM对象将始终根据枚举值返回不同值的字符串。

我如何测试我的RunTableInfoCommand是否正常工作,到目前为止,我有一个这样的测试:

public void RunTableInfoCommandPassingTableNumberShouldReturnExpectedName()
{
  string ExpectedCommand = "TableInfo(1,{0})".FormatWith((int)TableInfoEnum.TAB_INFO_NAME);

  mockmapinfo.Expect(m => m.Evaluate(ExpectedCommand))
             .Returns("Water_Mains");

  string name = Table.RunTableInfoCommand(mockmapinfo.Object,
                                                    1,
                                                    TableInfoEnum.TAB_INFO_NAME);

   Assert.AreEqual("Water_Mains", name);
 }

它确实有效,但我觉得我错过了什么,你如何测试所有不同的枚举类型。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您的测试方法应该将枚举值传递给COM对象并返回COM对象返回的字符串。因此,测试的目标是确保方法正确地与COM对象通信。

我会模拟COM对象以返回每个枚举值的预期字符串,然后将其传递给方法。

答案 1 :(得分:0)

好吧也许可以制作一个循环。这将通过所有枚举并打印出来。如果您希望它是完全自动的,则必须将所有正确的值放入数组中并让计算机进行比较。无论哪种方式,它看起来像你错过的一个重要部分是循环。

    public CheckAllEnumValues() {
            // somehow construct mockmapinfo here

            TableInfoEnum[] values = Enum.GetValues(typeof(TableInfoEnum));
            foreach(TableInfoEnum v in values) {
                    string result = RunTableInfoCommand(mockmapinfo.Object, v);
                    Console.WriteLine(Enum.GetName(typeof(TableInfoEnum), v) + ": " + result);
            }
    }