NUnit คัดลอกรายการ ILogicalThreadAffinative ใน CallContext ไปยังเธรดใหม่

ฉันพบปัญหากับ 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 เวอร์ชันที่ใหม่กว่าได้) ฉันได้ลองใช้แอตทริบิวต์ Requires* ที่มีอยู่ใน NUnit เวอร์ชันล่าสุดแล้ว แต่ก็ไม่ประสบความสำเร็จ ไม่มีใครรู้วิธีปิดพฤติกรรมนี้หรือไม่?


person Murian    schedule 02.12.2010    source แหล่งที่มา


คำตอบ (1)


ฉันไม่เชื่อว่าคุณสามารถทำสิ่งที่คุณพยายามที่จะทำ มีคนแนะนำให้วางโค้ดลงในชุดประกอบที่ผู้ทดสอบสามารถเข้าถึงได้

มีบล็อกโพสต์ที่คุณอาจทราบ ซึ่งอธิบายถึงสิ่งที่ ปัญหาคือ

โค้ดการทดสอบหน่วยที่ทำงานแบบมัลติเธรดอาจเป็นเรื่องที่ท้าทาย และฉันมักจะแยกเธรดและรวมอ็อบเจ็กต์แบบคงที่

ถ้าเป็นฉัน ฉันคิดว่าฉันคงจะพยายามแยก CallContext.SetData และ CallContext.GetData โดยการล้อมบริบทการโทรในคลาส CallContextWrapper : ICallContextWrapper

ฉันจะทดสอบว่าโค้ดของฉันใช้ contextWrapper.SetData("Test", f) และดำเนินการให้เสร็จสิ้น

ฉันเชื่อว่าใครก็ตามที่เขียน CallContext ได้ทดสอบความสามารถในการรับข้อมูลบางส่วนและถ่ายโอนไปยังเธรดใหม่ IMO CallContext เป็นโค้ดเฟรมเวิร์กที่ควรได้รับการทดสอบแล้ว ดังนั้น คุณเพียงแค่ต้องแยกการพึ่งพาโค้ดของคุณบน CallContext

person CedricB    schedule 05.12.2010