【问题标题】:UnitTesting : COM object that has been separated from its underlying RCW cannot be usedUnitTesting : 已与其底层 RCW 分离的 COM 对象无法使用
【发布时间】:2012-10-05 11:34:29
【问题描述】:

我用 C# 创建了一个 UnitTesting 项目,但遇到了一些问题。

首先,我想做一些在开始时应该只发生一次的 Connect 功能。 之后,我尝试从 Excel 文件中读取一些记录并测试一些插入操作,并且每次插入发生时 TestCleanUp() 在调用该构造函数然后调用 Initialize 方法后被触发。 我不希望构造函数在每条记录仅插入一次后触发。 我很困惑将我的 Connect 功能放在哪里以及如何避免每次都调用构造函数。

[TestClass]
    public class TestConnection
    {
        private TestContext testContextInstance;
        private static iCAM70003SDKC o_DeviceControl = null;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }



        [ClassInitialize()]   
        public static void Initialize()
        {

            int iResult = 0;
            EOperationalMode OperationalMode;



        }

现在我可以按照建议在 ClassInitialize 中建立初始连接。 现在,当我在 ClassInitialize 中创建我的 COM 对象的实例时,现在正在建立初始连接。 现在我有不同的测试方法要测试。 现在,当我运行我的程序时,在执行第一个测试方法“无法使用已与其底层 RCW 分离的 COM 对象”后出现异常?

我猜当它试图执行第二个测试方法时,COM 对象被破坏了。 如何保持这个 COM 对象活着? 我没有调用 ReleaseCOMObject。

【问题讨论】:

  • 如果在 STA 线程上创建了 COM 对象,则该线程拥有它——当线程退出时,您仍然拥有指向该 COM 对象的任何 .NET RCW 对象现在都与它断开连接。听起来您的测试框架正在从不同的线程调用每个方法。 -- 因此,当一个调用的线程关闭时,对象会断开连接,然后为下一个方法启动一个新线程并遇到此问题。您可以从每个方法中尝试Trace.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);,看看每个方法是否返回相同的结果。

标签: c# vs-unit-testing-framework


【解决方案1】:

您可以制作一个用 [ClassInitalize] 修饰的静态方法,该方法只会为测试类运行一次。这是建立初始连接的好地方。

【讨论】:

  • ClassInitialize 中 Testcontext 为空时,如何从 Excel 文件访问连接详细信息
  • 你的方法上有没有TestContext参数,像这样? [ClassInitialize()]public static void ClassInit(TestContext context) {}(有关更多信息,请参阅MSDN article
  • 我如何在类属性 context.DataRow 中读取 Excel 中的值,而 context.TestMethod 是正确的
【解决方案2】:

是的,在您的初始化方法上使用 [ClassInitialize] 属性。这只会为您的班级运行一次。

[ClassInitialize]
public static void Initialize() { ... }

如果您使用的是 NUnit,则相当于 [TestFixtureSetup]

确保您的 TestContext 是公开的,这样它就不会为空

如果您仍然面临 null 问题,以下链接可以帮助您 http://social.msdn.microsoft.com/Forums/en-US/vsautotest/thread/e9beee26-4927-4a60-b306-555f47cb3958/

【讨论】:

  • 我如何在类属性 context.DataRow 中读取 Excel 中的值,而 context.TestMethod 是正确的
猜你喜欢
  • 2011-11-21
  • 2012-04-27
  • 2011-07-03
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2011-07-15
相关资源
最近更新 更多