C#单元测试在COM对象上卡住了
我正在用C#做一个项目,我有一个cod,它在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
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控制台中运行它们解决了这个问题,因为在那里我可以将测试设置为在单个线程上运行,但是您的回答帮助我找到了这个解决方案。。。所以我会把它标记为正确的。谢谢