2008-10-12 32 views
16

我有一些組裝引用NUnit的,並創建了一個測試方法的單一測試類。我能夠獲得此程序集的文件系統路徑(例如「C:... \ test.dll」)。我想以編程方式使用NUnit來運行這個程序集。如何運行NUnit的編程

到目前爲止,我有:

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

但是,調用runner.Load(路徑)拋出一個FileNotFound例外。通過堆棧跟蹤,我可以看到問題出在NUnit上調用Assembly.Load(path)。如果我將路徑更改爲「Test,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null」,那麼我仍然會得到相同的錯誤。

我增加了一個事件處理程序AppDomain.Current.AssemblyResolve,看看我是否能手動解決此類型,但我的處理程序不會被調用。

的祕訣是什麼,這是讓Assembly.Load(...)來工作嗎?

+0

在結束我的解決方案是隻使用的xUnit。 NUnit有點笨重。 – 2011-09-20 00:51:43

回答

29

如果你想在一個控制檯模式打開,添加NUnit控制檯-runner.dll參考和使用:

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

如果你想在一個GUI模式開,加NUnit的 - 桂 - runner.dll參考和使用:

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

這是最好的方法,因爲你不甲肝e指定任何路徑。

另一種選擇也是NUnit的亞軍在Visual Studio調試器輸出整合:

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(); } 
     } 
    }; 
} 
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中被調用而不是我的代碼,所以我無法控制它。 – 2008-10-12 16:44:51

+0

我可能會需要只是把它經歷一個過程像你的建議......我寧願有對象爲我自己的顯示目的,但它應該是足夠好,只是使用的過程現在。 – 2008-10-12 16:46:20