gpt4 book ai didi

visual-studio-2010 - 是否可以在 VS 2010 的单元测试中使用逻辑调用上下文?

转载 作者:行者123 更新时间:2023-12-03 14:31:41 26 4
gpt4 key购买 nike

是否可以让这个测试不抛出异常?似乎将任何非 GACed 类添加到逻辑调用上下文中会导致在测试的第 2 行中引发异常。

Test 'TestProject1.UnitTest1.TestMethod1' failed: Test method TestProject1.UnitTest1.TestMethod1 threw exception: System.Configuration.ConfigurationErrorsException: An error occurred loading a configuration file: Type is not resolved for member 'TestProject1.Bar,TestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. ---> System.Runtime.Serialization.SerializationException: Type is not resolved for member 'TestProject1.Bar,TestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.


namespace TestProject1 {
[ Serializable]
public class Bar {

}

[TestClass]
public class UnitTest1 {
[TestMethod]
public void TestMethod1() {
CallContext.LogicalSetData("foo", new Bar());
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None );
}
}
}

为什么?!?!?

最佳答案

基本上,这是用于在测试运行期间托管测试代码的流程设计的问题。测试在与测试主机进程的默认 AppDomain 不同的 AppDomain 中运行。当从一个 AppDomain 到另一个 AppDomain 进行调用时,需要将调用上下文反序列化到目标 AppDomain。在您的情况下,ConfigurationManager.OpenExeConfiguration最终调用AppDomain.get_Evidence .这会导致从托管测试的 AppDomain 调用默认 AppDomain。

默认 AppDomain 的基本目录是测试主机可执行文件的安装位置。默认情况下,这是 "%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE" .托管测试的 AppDomain 使用测试运行部署位置的基本目录。默认情况下,这是 " \TestResults\ \Out" .因此,用于运行测试的 AppDomain 可以解析序列化类型,因为它们的程序集位于 Out 目录中(无论如何,它们已经加载到测试的 AppDomain 中,因为此代码执行),而默认 AppDomain 不能。

对包含序列化类型的程序集进行 GAC 处理是有效的,因为在程序集解析期间会探测 GAC。这是一种可能的解决方案。但是,您需要在每次测试运行时将它们安装到 GAC,这需要强名称和管理权限。

另一种可能的解决方案是将程序集复制到默认 AppDomain 的探测路径。这将是上面列出的基本目录和 QTAgent.exe.config 或 QTAgent32.exe.config 中列出的 privatePaths(运行哪个取决于您是否使用 64 位操作系统以及测试设置)。与所有私有(private)探测路径一样,这些目录必须是基本目录的子目录。您可以创建一个具有适当访问权限的新子目录,将目录名称添加到 .exe.config 文件中的 privatePaths,然后在测试设置期间将包含序列化类型的程序集复制到此目录中。该解决方案不需要管理权限或强命名,只要您将程序集复制到的目录允许您对其进行写入。

不幸的是,这些解决方案都不是理想的,因为如果在每次测试运行之前没有正确更新程序集,它们可能会在测试的 AppDomain 和默认 AppDomain 中运行的代码之间引入类型不匹配的可能性。 Microsoft 需要进行适当的修复(例如,当默认 AppDomain 需要解析类型时,让测试主机进程自动探测测试部署目录)。我没有在测试工具上工作,所以我无法评论真正的修复需要什么,考虑到实现细节。

编辑 :如果您确实选择了这些“解决方案”之一,您还需要禁用测试主机进程在测试运行之间保持事件状态。这是因为默认的 AppDomain 将保留,并且包含序列化类型的程序集将保持加载状态,从而阻止您在下一次测试运行时更新它们。对此进行控制的选项是“工具 -> 选项 -> 测试工具 -> 测试执行”下的“在测试运行之间保持测试执行引擎运行”。

关于visual-studio-2010 - 是否可以在 VS 2010 的单元测试中使用逻辑调用上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5439719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com