【发布时间】:2020-09-29 10:19:01
【问题描述】:
我有一些测试可以对数据库进行一些写操作。我知道这不是真正的单元测试,但让我们把它放在一边。
为了使每个测试都能在干净的工作区上运行,我回滚了迄今为止所做的所有事务。但是,由于无法建立数据库锁,我随机出现并发错误。
这是我的代码:
Test1.dll
[TestFixture]
class MyTest1
{
[OneTimeSetup]
public void SetupFixture()
{
myworkspace.StartEditing(); // this will establish a lock on the underlying database
}
[OneTimeTearDow]
public void TearDownFixture()
{
myWorkspace.Rollback();
}
}
相同的代码也存在于另一个测试程序集中,我们将其命名为Test2.dll。现在,当我使用 nunit3-console Test1.dll Test2.dll 使用 nunit-console-runner 时,出现以下错误:
System.Runtime.InteropServices.COMException:无法锁定表“GDB_DatabaseLocks”;它当前由主机“MyHost”上的用户“ADMIN”(这是我)使用 在 ESRI.ArcGIS.Geodatabase.IWorkspaceEdit.StartEditing(Boolean withUndoRedo)
myWorkspace 是一个与 MS-Access-Database 相关的 COM 对象(Arcobjects-interface IWorkspace)。我认为这是因为 nunit 创建了多个同时输入上述代码的线程。所以我将NonParalizable-attribute 添加到两个程序集中,但没有成功。我还尝试将Apartment(ApartmentState.STA) 添加到我的程序集中,以便在单个线程中执行所有内容,这导致控制台永远无法完成。
让我抓狂的是,使用 ReSahrpers 测试运行器运行我的测试可以完美运行。但是我不知道 ReSharper 是如何启动 nunit 的。似乎 ReSharper 不使用 nunit-console,而是使用 nunit-API。
还有其他方法可以强制我的所有测试在单个线程中运行吗?我使用 nunit3.10 和 ArcGIS 10.8。
【问题讨论】:
-
从这里知道你的答案,我不确定它是否对你有帮助。 As shown here 您需要将
ApartmentState.STA添加到程序集、类 和 方法级别。你试过吗?你的问题对我来说并不完全清楚。 -
@nilsK 哇,这很棒,因为有数百个测试。不过我会试试看的。
标签: c# nunit-3.0 arcobjects single-threaded