我正在尝试对自定义ConfigurationElementCollection
进行单元测试,但是我遇到了以编程方式填充集合的问题。当我致电BaseAdd()
时,我收到以下异常:
ConfigurationErrorsException:元素“add”已被锁定在更高级别的配置中。
但是,此问题仅在运行多个测试时出现。考虑这两个测试:
private Fixture Fixtures = new Fixture(); // AutoFixtures
[Test]
public void test1()
{
var tc = Fixtures.CreateAnonymous<TenantCollection>();
var t = Fixtures.CreateAnonymous<Tenant>();
tc.Add(t);
}
[Test]
public void test2()
{
var tc = Fixtures.CreateAnonymous<TenantCollection>();
var t = Fixtures.CreateAnonymous<Tenant>();
tc.Add(t);
}
单独执行时,每个单独的测试都会通过。当一起运行时,抛出锁定异常。
这里发生了什么?如何解锁集合或解决锁定?
答案 0 :(得分:20)
我仍然不完全确定ConfigurationElement
锁定是如何工作的,但我确实找到了一个似乎至少适用于单元测试的解决方法:在添加新项目之前,将LockItem
设置为false。
因此,在我的自定义ConfigurationElementCollection
中,我有方法Add()
(我在OP中调用)。需要将其修改为如下所示:
public class TenantCollection : ConfigurationElementCollection
{
public void Add(Tenant element)
{
LockItem = false; // the workaround
BaseAdd(element);
}
}