2012-04-30 59 views
9

我試圖單元測試定製ConfigurationElementCollection,但我有編程填充集合的問題。當我撥打BaseAdd()時,出現以下例外情況:如何編程元素添加到一個ConfigurationElementCollection中?

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); 
} 

單獨執行時,每個單獨的測試通過。當一起運行,鎖定拋出異常。

這是怎麼回事?我無論怎樣才能解開集合或工作圍繞鎖?

回答

18

我仍然不完全確定如何鎖定ConfigurationElement,但我確實發現了一種解決方法,對於單元測試來說似乎不錯,至少:在添加新項目之前,將LockItem設置爲false。

所以在我的自定義ConfigurationElementCollection我有方法Add()(我在OP我打電話)。它需要修改,看起來像這樣:

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

可以,還有,從TenantCollection實現覆蓋IsReadOnly方法並返回false –

相關問題