【问题标题】:What happens between TestMethods in MS Visual Studio Unit TestsMS Visual Studio 单元测试中的 TestMethods 之间会发生什么
【发布时间】:2010-09-07 16:16:42
【问题描述】:

标题说明了 - MS Visual Studio 单元测试中的 TestMethods 之间会发生什么?

我在一个具有 TestInitialize 方法的 TestClass 中有一堆 TestMethods。

TestInitialize 方法在内部通过反射加载类型(例如 Type.GetType("MyContainer, MyContainerAssembly") )。 MyContainer 是一个继承自 WindsorContainer(来自 Castle Windsor)的类。

当我选择在解决方案中运行所有单元测试时,第一次调用 TestInitialize(对于第一个 TestMethod),这一切都很好。当第二个 TestMethod 执行并调用 TestInitialize 时,我的 Type.GetType 调用返回 null。

我在 TestInitialize 方法中放置了一个断点并验证了这一点。为了调试问题,我尝试在即时窗口中:

Assembly.Load("MyContainerAssembly")

哪个有效...然后:

Assembly.Load("MyContainerAssembly").GetTypes()

你知道什么?它抛出了一个 TypeLoaderException,说它找不到程序集 Castle.Windsor。检查了单元测试项目的 bin\debug 目录。它就在那里。

然后我尝试了: Assembly.Load("Castle.Windsor")

哪个有效...然后:

Assembly.Load("Castle.Windsor").GetAssemblies()

...无法加载 Castle.Core...然后

Assembly.Load("Castle.Core")

然后

Type.GetType("MyContainer, MyContainerAssembly")

再次...它返回了 Type 实例,而不是 null。

想法?

【问题讨论】:

    标签: .net unit-testing visual-studio-2010 castle-windsor mstest


    【解决方案1】:

    Visual Studio 不会在 bin\Debug 输出文件夹中运行测试。相反,它有一个单独的TestResults 文件夹,其中it makes a new subfolder and copies assemblies for each test run。 (此文件夹与解决方案文件出现在同一文件夹中。)您提到的程序集可能没有被复制。

    您可以通过测试运行配置添加文件:打开测试菜单,“编辑测试运行配置”,选择要编辑的测试配置,然后选择“部署”视图。您可以在此处添加任何需要部署的额外文件。

    或者,您可以在测试中使用DeploymentItem 属性。

    【讨论】:

    • 谢谢!知道为什么文件不会在那里复制或为什么第一个 TestMethod 能够成功加载程序集吗?
    • @jeffn825:如果测试程序集不直接或间接地依赖它们,它们将不会被复制。至于为什么第一次会起作用,这对我来说没有任何意义。当我第一次阅读您的问题时,我错过了这一点。毕竟可能还有其他问题。
    • 虽然关于副本的信息是正确的,但我不同意例外的原因。第二次测试的失败似乎更有可能是因为程序集仍然是从最后一次测试中加载的。代码应在加载程序集之前测试它是否存在。
    猜你喜欢
    • 2010-12-24
    • 2019-01-28
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多