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

时间:2018-06-18 12:26:42

标签: c# unit-testing com

我正在研究C#中的一个项目,我有一块鳕鱼在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对象相关的问题但没有成功。

有没有人知道为什么调试器无法处理该行?或者为什么那片鳕鱼在主要但不在测试上工作?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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