NUnit копирование элементов ILogicalThreadAffinative в CallContext в новые потоки - PullRequest
1 голос
/ 02 декабря 2010

Я столкнулся с проблемой с NUnit и CallContext (используя C #), где NUnit копирует все в существующем контексте вызова, который расширяет ILogicalThreadAffinative при создании нового потока.Например, в следующем примере исключение всегда генерируется во вновь созданном потоке:

    [Test]
    public void TestCopiedCallContext()
    {
        Foo f = new Foo();
        f.a = 1;
        CallContext.SetData("Test", f);
        new Thread(new ThreadStart(delegate()
        {
            if (CallContext.GetData("Test") != null)
            {
                throw new Exception("Bad!");
            }
        })).Start();
        Thread.Sleep(500);
    }

    class Foo : ILogicalThreadAffinative
    {
        public int a;
    }

Если Foo не расширяет ILogicalThreadAffinative, то тест проходит.Я использую .NET 2.0 (из-за других ограничений мы не можем использовать более новые версии .NET).Я также пытался использовать атрибуты Require *, доступные в последней версии NUnit, но безуспешно.Кто-нибудь знает, как отключить это поведение?

1 Ответ

0 голосов
/ 05 декабря 2010

Я не верю, что вы можете делать то, что пытаетесь сделать.Один человек предложил поместить код в сборку, к которой у бегуна есть доступ.

Есть сообщение в блоге , о котором вы, вероятно, знаете, описывающее проблему.

Код модульного тестирования, который выполняет многопоточность, может быть сложным, и я стремлюсь изолировать потоки и переносить статические объекты.

Если бы это был я, я думаю, что я бы попытался изолировать CallContext.SetData и CallContext.GetData путем переноса контекста вызова в класс CallContextWrapper: ICallContextWrapper.

Я хотел бы проверить, что мой код использует contextWrapper.SetData ("Test", f) и покончить с этим;

Я быповерьте, что тот, кто написал CallContext, проверил свою способность принимать некоторые данные и переносить их в новый поток.IMO CallContext - это фреймворковый код, который уже должен был быть протестирован, поэтому вам просто нужно изолировать зависимость вашего кода от CallContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...