NUnit menyalin item ILogicalThreadAffinative di CallContext ke utas baru

Saya mengalami masalah dengan NUnit dan CallContext (menggunakan C#) di mana NUnit menyalin apa pun dalam konteks panggilan yang ada yang memperluas ILogicalThreadAffinative ketika utas baru dibuat. Misalnya, dalam contoh berikut, pengecualian selalu diberikan pada thread yang baru dibuat:

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

Jika Foo tidak memperluas ILogicalThreadAffinative maka pengujian berhasil. Saya menggunakan .NET 2.0 (karena batasan lain kami tidak dapat menggunakan versi .NET yang lebih baru). Saya juga mencoba menggunakan atribut Requires* yang tersedia di NUnit versi terbaru tetapi tidak berhasil. Adakah yang tahu cara mematikan perilaku ini?


person Murian    schedule 02.12.2010    source sumber


Jawaban (1)


Saya tidak percaya bahwa Anda dapat melakukan apa yang Anda coba lakukan. Seseorang telah menyarankan untuk memasukkan kode ke dalam perakitan di mana test runner memiliki akses ke kode tersebut.

Ada postingan blog yang mungkin Anda ketahui, yang menjelaskan apa yang dimaksud dengan masalahnya adalah.

Kode pengujian unit yang melakukan multithreading dapat menjadi tantangan dan saya cenderung mengisolasi thread dan membungkus objek statis.

Jika itu saya, saya pikir saya akan mencoba mengisolasi CallContext.SetData dan CallContext.GetData dengan membungkus konteks panggilan dalam kelas CallContextWrapper : ICallContextWrapper.

Saya akan menguji apakah kode saya menggunakan konteksWrapper.SetData("Test", f) dan menyelesaikannya;

Saya percaya siapa pun yang menulis CallContext menguji kemampuannya untuk mengambil beberapa data dan mentransfernya ke thread baru. IMO CallContext adalah kode kerangka kerja yang seharusnya sudah diuji sehingga Anda hanya perlu mengisolasi ketergantungan kode Anda pada CallContext.

person CedricB    schedule 05.12.2010