【发布时间】:2012-10-05 11:34:29
【问题描述】:
我用 C# 创建了一个 UnitTesting 项目,但遇到了一些问题。
首先,我想做一些在开始时应该只发生一次的 Connect 功能。 之后,我尝试从 Excel 文件中读取一些记录并测试一些插入操作,并且每次插入发生时 TestCleanUp() 在调用该构造函数然后调用 Initialize 方法后被触发。 我不希望构造函数在每条记录仅插入一次后触发。 我很困惑将我的 Connect 功能放在哪里以及如何避免每次都调用构造函数。
[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;
}
现在我可以按照建议在 ClassInitialize 中建立初始连接。 现在,当我在 ClassInitialize 中创建我的 COM 对象的实例时,现在正在建立初始连接。 现在我有不同的测试方法要测试。 现在,当我运行我的程序时,在执行第一个测试方法“无法使用已与其底层 RCW 分离的 COM 对象”后出现异常?
我猜当它试图执行第二个测试方法时,COM 对象被破坏了。 如何保持这个 COM 对象活着? 我没有调用 ReleaseCOMObject。
【问题讨论】:
-
如果在 STA 线程上创建了 COM 对象,则该线程拥有它——当线程退出时,您仍然拥有指向该 COM 对象的任何 .NET RCW 对象现在都与它断开连接。听起来您的测试框架正在从不同的线程调用每个方法。 -- 因此,当一个调用的线程关闭时,对象会断开连接,然后为下一个方法启动一个新线程并遇到此问题。您可以从每个方法中尝试
Trace.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);,看看每个方法是否返回相同的结果。
标签: c# vs-unit-testing-framework