18

NUnitを参照し、単一のテストメソッドで単一のテストクラスを作成するアセンブリがいくつかあります。このアセンブリへのファイルシステムパスを取得できます(例:「C:... \ test.dll」)。プログラムでNUnitを使用して、このアセンブリに対して実行したいと思います。

これまでのところ:

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

ただし、runner.Load(path)を呼び出すと、FileNotFound例外がスローされます。スタックトレースから、問題はNUnitがスタックのAssembly.Load(path)を呼び出すことにあることがわかります。パスを「Test、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null」のように変更しても、同じエラーが発生します。

AppDomain.Current.AssemblyResolveにイベントハンドラーを追加して、このタイプを手動で解決できるかどうかを確認しましたが、ハンドラーが呼び出されません。

Assembly.Load(...)を機能させる秘訣は何ですか?

4

2 に答える 2

29

コンソール モードで開きたい場合は、 nunit-console-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"
   });

パスを指定する必要がないため、これが最適な方法です。

もう 1 つのオプションは、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(); }
        }
    };
}
于 2009-01-16T10:58:50.597 に答える
3

「Assembly.Loadを機能させる秘訣は何ですか?」

System.Reflection.Assembly.Loadは、ファイルへのパスではなく、アセンブリ名を含む文字列を取ります。

ファイルからアセンブリをロードする場合は、次を使用します。

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

(LoadFromは実際にはAssembly.Loadを内部的に使用します)

ちなみに、NUnit-Consoleコマンドラインツールを使用して、テストアセンブリへのパスを渡すことができない理由はありますか?次に、System.Diagnostics.Processを使用して、クライアントアプリケーション内からこれを実行できますが、もっと簡単かもしれません。

于 2008-10-12T03:47:55.073 に答える