2010-12-02 2 views
1

NUnit 및 CallContext (C# 사용)에서 NUnit이 새 스레드가 생성 될 때 ILogicalThreadAffinative를 확장하는 기존 호출 컨텍스트의 내용을 복사하는 문제가 발생했습니다. 예를 들어, 다음 예제에서 예외가 항상 새로 만든 스레드에서 발생합니다 : 푸 ILogicalThreadAffinative을 연장하지 않는 경우NUnit은 CallContext의 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; 
    } 

다음 테스트를 통과. .NET 2.0을 사용하고 있습니다 (다른 제한 사항으로 인해 최신 버전의 .NET을 사용할 수 없음). 나는 또한 최신 버전의 NUnit에서 사용할 수있는 Requires * 속성을 사용해 보았지만 성공하지 못했습니다. 아무도이 동작을 해제하는 방법을 알고 있습니까?

답변

0

나는 당신이하려고하는 것을 할 수 있다고 생각하지 않는다. 한 사람은 테스트 러너가 액세스 할 수있는 어셈블리에 코드를 삽입 할 것을 제안했습니다.

문제가 무엇인지 설명하는 blog post이 있습니다.

멀티 스레딩을하는 단위 테스트 코드는 어려울 수 있으며 스레드를 격리하고 정적 객체를 래핑하는 경향이 있습니다.

저라면 제 생각에는 CallContextWetter : ICallContextWrapper 클래스에서 호출 컨텍스트를 래핑하여 CallContext.SetData 및 CallContext.GetData를 격리하려고 할 것이라고 생각합니다.

필자는 내 코드가 contextWrapper.SetData ("Test", f)를 사용하고 있는지 테스트 할 것입니다.

필자는 CallContext를 작성한 사람이 일부 데이터를 가져 와서 새 스레드로 전송할 수 있는지 테스트했습니다. IMO CallContext는 이미 테스트를 거쳐야하는 프레임 워크 코드이므로 CallContext에 대한 코드 의존성을 격리해야합니다.

관련 문제