C#单元测试在COM对象上卡住了

C#单元测试在COM对象上卡住了,c#,unit-testing,com,C#,Unit Testing,Com,我正在用C#做一个项目,我有一个cod,它在main()中工作得很好,但是在测试中,调试器被COM对象调用卡住了,测试无法通过这一行 代码如下: private ICMSDWorkset CMSWorkset; private ICMSDProject CMSProject; [TestMethod()] public void CMSConnector_EntityProviderTest() { string connectionStr

我正在用C#做一个项目,我有一个cod,它在
main()
中工作得很好,但是在测试中,调试器被COM对象调用卡住了,测试无法通过这一行

代码如下:

    private ICMSDWorkset CMSWorkset;
    private ICMSDProject CMSProject;
    [TestMethod()]
    public void CMSConnector_EntityProviderTest()
    {
        string connectionString = @"PATH";

        CMSAPI capi = new CMSAPI();
        //capi.Init(connectionString, "USER", "Project name");
        Init(connectionString, "@SETUP", "iDB_P01");

        Terminate();
    }
    private void Init(String connectionString, string currentUser, string currentProject)
    {
        CMSWorkset = new CPLTWorkset() as ICMSDWorkset;

        CMSWorkset.Init("", "", connectionString);

        if (!CMSWorkset.IsInitialized())
            throw new ArgumentException(
                new StringBuilder().AppendFormat("")
                    .AppendFormat("initialization failed for connection string '{0}'", connectionString)
                    .ToString()
            );

        // set user
        ICMSDOwnCollection tmpColl = CMSWorkset.GetAllUsers() as ICMSDOwnCollection;
        CMSWorkset.SetCurrentUser(tmpColl.Item(currentUser));

        // set project as current in workset
        tmpColl = CMSWorkset.GetAllProjects() as ICMSDOwnCollection;
        CMSProject = tmpColl.Item(currentProject) as ICMSDProject;
        CMSWorkset.SetCurrentProject(CMSProject);

        if (!CMSWorkset.IsInitialized())
            throw new ArgumentException(
                new StringBuilder().AppendFormat("")
                    .AppendFormat("initialization failed for connection string '{0}', user '{1}' and project name '{2}'",
                        connectionString, currentUser, currentProject)
                    .ToString()
            );
    }

    public void Terminate()
    {
        // do the deallocations; mandatory
        CMSWorkset.Terminate();
        CMSWorkset = null;
    }
在测试调试时,当我按下“前进”键并到达此行时:

CMSWorkset = new CPLTWorkset() as ICMSDWorkset;
调试器停止工作,测试继续运行,但仍停留在该行。不会引发任何错误或异常

CPLTWorkset
是COM对象的包装器

我检查了“本机代码调试”以及其他提到的与COM对象相关的问题,但没有成功

有人知道为什么调试器不能处理这一行吗?或者为什么鳕鱼只在干管上工作,而不在测试上工作


谢谢

我的第一个猜测是
new CPLTWorkset()
调用的代码只在标记为。Main方法具有此属性,使主线程成为单线程单元线程,而单元测试框架使用的线程不是


请注意,仅仅调用可能无法解决此问题;当一个线程是STA线程时,这也意味着一个事件循环正在其上泵送(例如,在WinForms中,将被调用)。这在单元测试中是很难实现的,除非你真的知道自己在做什么。

为什么一个假定的独立单元测试需要与COM交互?正如Nkosi上面所说的。根据定义,如果您使用的是COM,那么这不是单元测试。我建议您要么模拟COM调用,要么采取完全不同的方法。与调试器或fish无关,死锁在使用未设计为线程安全的COM服务器时并不罕见。这个问题没有关于测试运行者的足够详细信息,通过谷歌搜索“c#mstest公寓州”来找到相关的解决方案。你是对的。经过一些研究,我通过在NUnit控制台中运行它们解决了这个问题,因为在那里我可以将测试设置为在单个线程上运行,但是您的回答帮助我找到了这个解决方案。。。所以我会把它标记为正确的。谢谢