当前位置:  开发笔记 > 编程语言 > 正文

单元测试中的C#扩展方法奇数

如何解决《单元测试中的C#扩展方法奇数》经验,为你挑选了1个好方法。

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

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

public static bool IsTypeOf(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提到的那样,它更像是我目前关注的异常来源.

解决方案:我尝试了许多不同的东西,同意Marc关于它是参考问题的思路.删除引用,清理/重建,重新启动Visual Studio不起作用.最终,我最终在我的硬盘上搜索已编译的DLL并将其从任何没有意义的地方删除.删除除TestResults文件夹中的实例以外的所有实例后,我能够成功重建并重新运行单元测试.

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

解决后:实际的方法并不像我想象的那样复杂.这是实际的工作方法:

public static void IsTypeOf(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)
    { }
}

Marc Gravell.. 5

通常,MissingMethodException表示您正在将一个不同版本的dll加载到您在构建期间引用的那个版本,并且您正在加载的实际dll(在运行时)没有编译器找到的方法(在编译时) .

检查你是不是以某种方式得到了不同项目引用的各种版本的dll.可能是当你在调试模式下运行它时,其他一些代码会首先加载正确的 dll,但是当在上下文中运行时,这个其他代码不会运行 - 所以加载了不正确的版本.

如果最近添加了失败的方法,这将会加倍应用,因此可能不会引用旧版本.

如果使用完整程序集版本控制,则可以查看调试输出以确切地查看哪些程序集加载.



1> Marc Gravell..:

通常,MissingMethodException表示您正在将一个不同版本的dll加载到您在构建期间引用的那个版本,并且您正在加载的实际dll(在运行时)没有编译器找到的方法(在编译时) .

检查你是不是以某种方式得到了不同项目引用的各种版本的dll.可能是当你在调试模式下运行它时,其他一些代码会首先加载正确的 dll,但是当在上下文中运行时,这个其他代码不会运行 - 所以加载了不正确的版本.

如果最近添加了失败的方法,这将会加倍应用,因此可能不会引用旧版本.

如果使用完整程序集版本控制,则可以查看调试输出以确切地查看哪些程序集加载.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有