我正在研究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对象相关的问题但没有成功。
有没有人知道为什么调试器无法处理该行?或者为什么那片鳕鱼在主要但不在测试上工作?
谢谢!
答案 0 :(得分:0)
我的第一个猜测是new CPLTWorkset()
调用的代码仅适用于标记为[STAThread]
的线程。您的Main方法具有此属性,使主线程成为单线程单元线程,而单元测试框架使用的线程则不是。
请注意,仅调用Thread.SetAparatmentState可能无法解决此问题;当一个线程是一个STA线程时,这也意味着一个事件循环正在它上面(例如在WinForms中,将调用Application.Run)。除非你真的知道自己在做什么,否则在单元测试中很难实现。