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"
   });

这是最好的方法,因为您不必指定任何路径。

另一种选择是将 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 回答