11

custom を単体テストしようとしてConfigurationElementCollectionいますが、コレクションをプログラムで設定するのに問題があります。を呼び出すとBaseAdd()、次の例外が発生します。

ConfigurationErrorsException : エレメント 'add' が上位レベルの構成でロックされています。

ただし、この問題は複数のテストを実行している場合にのみ発生します。次の 2 つのテストを検討してください。

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

個々のテストは、単独で実行すると合格します。一緒に実行すると、ロック例外がスローされます。

何が起きてる?コレクションのロックを解除するか、そのロックを回避するにはどうすればよいですか?

4

1 に答える 1

21

ロックがどのように機能するかはまだ完全ConfigurationElementにはわかりませんが、少なくともユニットテストでは問題ないように見える回避策を見つけました。新しいアイテムを追加する前に、LockItemfalseに設定してください。

だから私の習慣ConfigurationElementCollectionでは、私はメソッドを持っていますAdd()(私はOPで呼び出しています)。次のように変更する必要があります。

public class TenantCollection : ConfigurationElementCollection
{
    public void Add(Tenant element)
    {
        LockItem = false;  // the workaround
        BaseAdd(element);
    }
}
于 2012-05-07T16:20:36.940 に答える