C# 单元测试:无法使用已与其基础RCW分离的COM对象

C# 单元测试:无法使用已与其基础RCW分离的COM对象,c#,vs-unit-testing-framework,C#,Vs Unit Testing Framework,我在C#中创建了一个单元测试项目,并面临一些问题 首先,我想做一些连接功能,这些功能一开始只应该发生一次。 之后,我试图从Excel文件中读取一些记录,并测试一些插入操作,每次插入时,调用构造函数后就会触发TestCleanUp(),然后初始化方法。 我不想在每个记录只插入一次后,构造函数就着火。 我不知道在哪里放置连接功能,以及如何避免每次调用构造函数 [TestClass] public class TestConnection { private TestC

我在C#中创建了一个单元测试项目,并面临一些问题

首先,我想做一些连接功能,这些功能一开始只应该发生一次。 之后,我试图从Excel文件中读取一些记录,并测试一些插入操作,每次插入时,调用构造函数后就会触发TestCleanUp(),然后初始化方法。 我不想在每个记录只插入一次后,构造函数就着火。 我不知道在哪里放置连接功能,以及如何避免每次调用构造函数

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



        }
[TestClass]
公共类TestConnection
{
私有TestContext testContextInstance;
专用静态iCAM70003SDKC o_设备控制=空;
/// 
///获取或设置提供
///有关当前测试运行的信息和功能。
///
公共TestContext TestContext
{
得到
{
返回testContextInstance;
}
设置
{
testContextInstance=值;
}
}
[ClassInitialize()]
公共静态void Initialize()
{
int-iResult=0;
操作模式操作模式;
}
现在我可以按照建议在ClassInitialize中建立初始连接。 现在,当我在ClassInitialize中创建COM对象的实例时,现在进行初始连接。 现在我有不同的测试方法要测试。 现在,当我运行我的程序时,我在执行第一个testmethod“不能使用已与其底层RCW分离的COM对象”后遇到异常

我猜当它试图执行第二个testmethod时,COM对象被破坏了。 如何使此COM对象保持活动状态?
我没有调用ReleaseCOMObject。

您可以创建一个用[ClassInitialize]修饰的静态方法,该方法对于测试类只运行一次。这是一个建立初始连接的好地方。

是的,在初始化方法上使用[ClassInitialize]属性。这对于您的类只运行一次

[ClassInitialize]
public static void Initialize() { ... }
如果您使用的是NUnit,则等价物为[TestFixtureSetup]

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

如果您仍然面临空值问题,下面的链接可以帮助您

如何在ClassInitialized中Testcontext为null时从Excel文件访问连接详细信息方法上是否有Testcontext参数,如下图所示?[ClassInitialize()]公共静态void Classini(Testcontext context){}(有关详细信息,请参阅)如何在类属性context.DataRow为null而context.TestMethod为properHow我可以在类属性context.DataRow为null而context.TestMethod为properHow中从Excel中读取值如果在STA线程上创建了COM对象,则该线程拥有该对象--当线程退出时,您可以使用任何.NET RCW对象还有一点是,COM对象现在已与之断开连接。听起来您的测试框架正在从不同的线程调用每个方法。--因此,当一个调用的线程关闭时,对象断开连接,然后一个新线程为下一个方法启动,并出现此问题。您可以尝试
Trace.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
从每个方法中删除,并查看每个方法是否返回相同的结果。