2012-04-30 10 views
9

Estoy intentando probar la unidad de forma personalizada ConfigurationElementCollection, pero tengo un problema al completar la colección mediante programación. Cuando llamo BaseAdd(), me sale el siguiente excepción:¿Cómo agrego elementos mediante programación a una ConfigurationElementCollection?

ConfigurationErrorsException: se ha bloqueado en una configuración de mayor nivel, el elemento 'añadir'.

Sin embargo, este problema solo aparece cuando se ejecutan varias pruebas. Tenga en cuenta estas dos pruebas:

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

Cada prueba individual pasa cuando se ejecuta solo. Cuando se ejecutan juntos, se lanza la excepción de bloqueo.

¿Qué está pasando aquí? ¿Cómo puedo desbloquear la colección o trabajar alrededor de ese bloqueo?

Respuesta

18

Todavía no estoy del todo seguro de cómo funciona el bloqueo de ConfigurationElement, pero sí encontré una solución alternativa que parece adecuada para las pruebas unitarias: antes de agregar nuevos elementos, establezca LockItem en falso.

Así que en mi costumbre ConfigurationElementCollection Tengo el método Add() (que estoy llamando en el OP). Es necesario modificarlo para que se vea así:

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

También puede anular el método IsReadOnly de la implementación de TenantCollection y devolver falso –

Cuestiones relacionadas