2008-10-12 6 views
16

NUnit을 참조하고 단일 테스트 메서드로 단일 테스트 클래스를 만드는 어셈블리가 있습니다. 이 어셈블리에 대한 파일 시스템 경로를 가져올 수 있습니다 (예 : "C : ... \ test.dll"). NUnit을 프로그래밍 방식으로 사용하여이 어셈블리에 대해 실행하고 싶습니다.NUnit을 프로그래밍 방식으로 실행하는 방법

지금까지 내가 가진 :

var runner = new SimpleTestRunner(); 
runner.Load(path); 
var result = runner.Run(NullListener.NULL); 

을하지만, FileNotFound 예외가 발생 runner.Load (경로)를 호출. 스택에있는 Assembly.Load (path)를 호출하는 NUnit에 문제가 있음을 스택 트레이스를 통해 알 수 있습니다. "Test, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null"과 같이 경로를 변경하면 여전히 동일한 오류가 발생합니다.

AppDomain.Current.AssemblyResolve에 이벤트 처리기를 추가하여이 유형을 수동으로 해결할 수 있는지 여부를 확인했지만 처리기가 호출되지 않습니다.

Assembly.Load (...)를 작동시키는 데 필요한 비밀은 무엇입니까 ??

+0

. NUnit은 일종의 무난합니다. –

답변

29

당신이하는 콘솔 모드에서 열 NUNIT - 콘솔 runner.dll 참조 및 사용을 추가하려면 :

NUnit.ConsoleRunner.Runner.Main(new string[] 
    { 
     System.Reflection.Assembly.GetExecutingAssembly().Location, 
    }); 

당신이 GUI 모드에서 열려면 추가 NUNIT - GUI-runner.dll 참조 및 사용 : 당신이 근래하지 않기 때문에

NUnit.Gui.AppEntry.Main(new string[] 
    { 
     System.Reflection.Assembly.GetExecutingAssembly().Location, 
     "/run" 
    }); 

이 최선의 방법입니다 e를 사용하여 경로를 지정하십시오.

또 다른 옵션은 비주얼 스튜디오 디버거 출력에 NUnit과 러너를 통합 할 수도 : 내 솔루션은 단지 xUnit의를 사용하는 것이었다 결국

public static void Main() 
{ 
    var assembly = Assembly.GetExecutingAssembly().FullName; 
    new TextUI (new DebugTextWriter()).Execute(new[] { assembly, "-wait" }); 
} 

public class DebugTextWriter : StreamWriter 
{ 
    public DebugTextWriter() 
     : base(new DebugOutStream(), Encoding.Unicode, 1024) 
    { 
     this.AutoFlush = true; 
    } 

    class DebugOutStream : Stream 
    { 
     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Debug.Write(Encoding.Unicode.GetString(buffer, offset, count)); 
     } 

     public override bool CanRead { get { return false; } } 
     public override bool CanSeek { get { return false; } } 
     public override bool CanWrite { get { return true; } } 
     public override void Flush() { Debug.Flush(); } 
     public override long Length { get { throw new InvalidOperationException(); } } 
     public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); } 
     public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); } 
     public override void SetLength(long value) { throw new InvalidOperationException(); } 
     public override long Position 
     { 
      get { throw new InvalidOperationException(); } 
      set { throw new InvalidOperationException(); } 
     } 
    }; 
} 
+0

이 접근 방식을 시도하고 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."제공합니다. Main 호출 할 때. 아마 다른 args는 지금 예상됩니까? – Justin

+2

gui 모드와 nunit-gui-runner.dll을 사용하는 경우 기본 함수를 [STAThread]로 표시하는 것을 잊지 마십시오. – Wes

+0

두 번째 예인 GUI를 방금했습니다. ''/ run "을''-run ''으로 변경해야했습니다. 데비안 GNU/리눅스에서 돌아가고 있습니다. –

3

"Assembly.Load를 작동시키는 데 필요한 비밀은 무엇입니까?"

System.Reflection.Assembly.Load는 파일 경로가 아닌 어셈블리 이름이 포함 된 문자열을 사용합니다.

당신은 파일 사용에서 어셈블리를로드하려면 :

Assembly a = System.Reflection.Assembly.LoadFrom(pathToFileOnDisk); 

가 그런데

는, 어떤 이유가 (LoadFrom 실제로 Assembly.Load가 내부적으로 사용) 왜 당신이 할 수있는; t 사용 NUnit-Console command line tool 그리고 테스트 어셈블리의 경로 만 전달하면됩니까? 그런 다음 System.Diagnostics.Process를 사용하여 클라이언트 응용 프로그램 내에서이를 실행하면 더 간단 할 수 있습니다.

+0

음, LoadFrom을 사용할 수 있으면 좋겠지 만 불행하게도 Assembly.Load가 NUnit 내에서 호출되지 않아서 코드를 제어 할 수 없습니다. –

+0

아마 당신이 제안한 것처럼 프로세스를 통해 호출해야 할 것입니다 ... 나는 내 자신의 디스플레이 목적을 위해 개체를 갖고 싶지만 지금은 프로세스를 사용하기에 충분해야합니다. –

+0

프로그래밍에 '비밀'이 없습니다! –