2008-10-12 11 views
16

NUnit'e başvuran ve tek bir test yöntemiyle tek bir test sınıfı oluşturan bazı derlemelerim var. Bu derleme dosya sistemi yolunu (örneğin "C: ... \ test.dll") alabiliyorum. Bu derleme karşı çalıştırmak için NUnit'i programlı olarak kullanmak istiyorum.NUnit program aracılığıyla çalıştırılıyor

Şimdiye kadar var:

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

Ancak FileNotFound istisna atar runner.Load (yol) çağırarak. Yığın izini görebilmek için sorunun NUnit yığında aşağıya Assembly.Load (yol) çağırdığını görüyorum. "Test, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null" gibi bir şey olması için yolu değiştirirsem, hala aynı hatayı alırım.

Bu türü el ile çözüp çözemeyeceğimi görmek için AppDomain.Current.AssemblyResolve'a bir olay işleyicisi ekledim ancak işleyicim hiçbir zaman çağrılmıyor.

Assembly.Load (...) çalışmasını elde etmenin sırrı nedir?

+0

. NUnit çok çirkin. –

cevap

29

Eğer bir konsol modunda açılacak nunit-konsol runner.dll başvuru ve kullanımını eklemek istiyorsanız:

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

Bir gui modunda açmak istiyorsanız, eklemek nunit-gui-runner.dll referans ve kullanım: Eğer hav çünkü

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

Bu en iyi yaklaşımdır e herhangi bir yol belirtmek için.

Diğer bir seçenek, Visual Studio hata çıktısında NUnit koşucusu entegre etmek de geçerli: Benim çözüm sadece XUnit kullanmaktı Sonunda

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

Bu yaklaşımı denedim ve "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" verir. Main'i ararken. Belki de farklı hatalar bekleniyor? Eğer gui modunu & nunit-gui-runner.dll kullanıyorsanız – Justin

+2

, [STAThread] olarak ana fonk işaretlemek için unutma. – Wes

+0

Sadece ikinci örneği yaptım, GUI. '/ Run '' '' -run' 'arasında değiştirmek zorundaydım. Debian Gnu/Linux üzerinde koşuyorum. –

3

"Assembly.Load ürününü işe almanın sırrı nedir?"

System.Reflection.Assembly.Load bir dosya adı değil, bir derleme adı içeren bir dize alır.

bir dosya kullanım derleme yüklenemedi isterseniz:

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

arada

, herhangi bir neden yoktur (LoadFrom aslında assembly.load dahili olarak kullanır) neden gidebildiğini; t kullanımı NUnit-Console command line tool ve sadece test tertibatınızın yolunu mu geçirdiniz? Daha sonra bunu istemci uygulamanızdan çalıştırmak için System.Diagnostics.Process'i kullanabilirsiniz, daha basit olabilir mi?

+0

Eh, LoadFrom'u kullanabilmeyi isterdim ama maalesef Assembly.Load NUnit içinden kodumdan çağrılıyor, bu yüzden kontrol edemiyorum. –

+0

Muhtemelen önerdiğin gibi bir süreçle çağırmam gerekecek ... Kendi gösterim amaçlı objelerim olmasını isterim, ama şimdilik bir süreci kullanmak için yeterince iyi olmalı. –

+0

Programlamada 'sırlar' yok! –