如何以编程方式将元素添加到ConfigurationElementCollection?

时间:2012-04-30 16:30:58

标签: .net unit-testing configuration app-config

我正在尝试对自定义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);
}

单独执行时,每个单独的测试都会通过。当一起运行时,抛出锁定异常。

这里发生了什么?如何解锁集合或解决锁定?

1 个答案:

答案 0 :(得分:20)

我仍然不完全确定ConfigurationElement锁定是如何工作的,但我确实找到了一个似乎至少适用于单元测试的解决方法:在添加新项目之前,将LockItem设置为false。

因此,在我的自定义ConfigurationElementCollection中,我有方法Add()(我在OP中调用)。需要将其修改为如下所示:

public class TenantCollection : ConfigurationElementCollection
{
    public void Add(Tenant element)
    {
        LockItem = false;  // the workaround
        BaseAdd(element);
    }
}