单元测试期间的 C# 扩展方法奇怪

标签 c# .net unit-testing exception extension-methods

使用 Visual Studio 2008/C#/VS 单元测试。

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

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));

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

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

有没有人在任何地方遇到过这个?

编辑:这是代码的简化示例。基本上,这是我在没有周围代码包袱的情况下能够创建的最小的可重现示例。当放入单元测试时,这个单独的方法也会单独抛出 MissingMethodException,如上所示。有问题的代码没有完成手头的任务,就像 Jon 提到的那样,它更多是我目前关注的异常来源。

解决方案:我尝试了很多不同的方法,同意 Marc 的思路,认为它是一个引用问题。删除引用、清理/重建、重新启动 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)
    { }
}

最佳答案

通常,MissingMethodException 意味着您正在将不同版本的 dll 加载到您在构建期间引用的版本,而您正在加载的实际 dll(在运行时)没有编译器找到的方法(在编译时)。

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

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

如果您使用的是完整的程序集版本控制,您可能能够观察调试输出以准确了解加载了哪些程序集。

关于单元测试期间的 C# 扩展方法奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/350951/

相关文章:

c# - 有没有办法预先构建我在 Simple Injector 容器中注册的所有服务?

c# - 如果使用无效的泛型类型,我应该抛出异常吗?如果是,抛出哪个异常?

c# - 扩展 ASP.net HelpPage 主页

c# - 将 .NET 程序集引用解析为不同的名称?

c# - 使用 Rhino Mocks 如何为模拟方法设置参数属性

node.js - 如何比较完整的 JSON 对象

c# - 如何在 C# 中从 Firebase 中删除所有监听器?

为只读命名管道(NamedPipeClientStream 类)启用 MessageMode 时出现 C# UnauthorizedAccessException

c# - 找不到文件异常..但它在那里

MATLAB 基于类的单元测试 : How to pass in variable to test