代码之家  ›  专栏  ›  技术社区  ›  Joseph Ferris

单元测试中的C#扩展方法异常

  •  4
  • Joseph Ferris  · 技术社区  · 17 年前

    我有一个非常简单的扩展方法,可以告诉我对象是否属于特定类型:

    public static bool IsTypeOf<T, O>(this T item, O other)
    {
        if (!(item.GetType() is O))
            return false;
        else
            return true;
    }
    

    这将被称为:

    Hashtable myHash = new Hashtable();
    bool out = myHash.IsTypeOf(typeof(Hashtable));
    

    在调试模式下运行代码或调试单元测试时,该方法工作正常。然而,在我刚刚在上下文中运行所有单元测试的那一刻,我神秘地得到了该方法的MissingMethodException。奇怪的是,同一类中的另一个扩展方法没有问题。

    我倾向于问题不是扩展方法本身。我尝试过删除临时文件、关闭/重新打开/清理/重建解决方案等。到目前为止,没有任何效果。

    编辑:这是一个简化的代码示例。基本上,这是我能够创建的最小的可复制示例,而不需要周围代码的包袱。当放入单元测试时,这个单独的方法也会单独抛出MissingMethodException,如上所述。所讨论的代码并没有完成手头的任务,正如Jon所提到的,它更像是我目前关心的异常的来源。

    解决方案:我尝试了许多不同的方法,同意马克的观点,认为这是一个参考问题。删除引用、清理/重建、重新启动Visual Studio无效。最终,我在硬盘上搜索编译后的DLL,并将其从任何没有意义的地方删除。删除所有实例(TestResults文件夹中的实例除外)后,我就能够成功地重建并重新运行单元测试。

    至于方法的内容,是在单元测试中我发现了这个问题,但始终无法让这个概念发挥作用。由于O是一个RunTimeType,我似乎没有太多的访问权限,并且尝试使用IsAssignableFrom()来正确返回函数。此时,此函数已从我的验证方法中删除,将在其他时间重新访问。然而,在删除这篇文章之前,我仍然得到了最初的问题,这篇文章以许多其他方法开始。

    后解决方案:实际的方法并不像我想象的那么复杂。以下是实际工作方法:

    public static void IsTypeOf<T>(this T item, Type type)
    {
        if (!(type.IsAssignableFrom(item.GetType())))
            throw new ArgumentException("Invalid object type");
    }
    

    以及单元测试来验证它:

    [TestMethod]
    public void IsTypeOfTest()
    {
        Hashtable myTable = new Hashtable();
        myTable.IsTypeOf(typeof(Hashtable));
    
        try
        {
            myTable.IsTypeOf(typeof(System.String));
            Assert.Fail("Type comparison should fail.");
        }
        catch (ArgumentException)
        { }
    }
    
    2 回复  |  直到 17 年前
        1
  •  5
  •   Marc Gravell    17 年前

    通常是 MissingMethodException

    检查您是否没有以某种方式获得不同项目引用的dll的不同版本。可能是当您在调试模式下运行它时,其他一些代码会使 对的 首先加载dll,但在上下文中运行时,其他代码不会运行-因此 不准确的

    如果最近添加了失败的方法,则这将加倍适用,因此可能不在引用的旧版本中。

        2
  •  0
  •   shahkalpesh    17 年前

    我在这里猜测。

    对该方法施加约束,看看这是否有帮助 Pseudocode

    }

    编辑:该类是正在测试的程序集的一部分吗?