这是我第一次尝试破解NUnit接口,并且遇到一些问题。NUnit API和以编程方式运行测试
这就是我想实现:
- 取一组字符串输入,代码文件和编译成汇编
- 走在内存组合,并传递给NUnit的识别并运行此代码测试
这是我迄今为止
/// <summary> Validates whether the code files are valid </summary>
public string Validate(string[] codefiles)
{
// To avoid NullReferenceException within NUnit
// don't know why this is needed!
TestExecutionContext.CurrentContext.TestPackage
= new TestPackage("PersonTest");
var assembly = BuildAssembly(codefiles);
TestSuite suite = new TestAssembly(assembly, "PersonTest");
var result = suite.Run(new NullListener(), TestFilter.Empty);
return result.IsSuccess ? string.Empty : result.Message;
}
/// <summary> Builds an assembly </summary>
private static Assembly BuildAssembly(string[] code)
{
var compilerparams = new CompilerParameters(new[] {"nunit.framework.dll"})
{
GenerateExecutable = false,
GenerateInMemory = true
};
var results = new CSharpCodeProvider()
.CompileAssemblyFromSource(compilerparams, code);
if (!results.Errors.HasErrors) return results.CompiledAssembly;
throw new Exception(GetErrors(results));
}
这些是两个字符串我试图编译(通过发送作为字符串数组与两个元件到上述验证方法)
private const string File1 = @"
public class Person
{
public string Name {get;set;}
public Person(string name)
{
Name = name;
}
}";
private const string ProperInput = @"
using NUnit.Framework;
[TestFixture]
public class PersonTest
{
[Test]
public void CheckConstructor()
{
var me = new Person(""Roopesh Shenoy"");
Assert.AreEqual(""Roopesh Shenoy"", me.Name);
}
}";
问题:
编译发生细 - 即使产生的组件具有这些两种类型。也不会将nunit.framework.dll传递到引用的程序集中,这会导致编译异常(动态编辑时),因此这意味着TestFixture/Test引用也会被识别。
但是,当我调试TestAssembly只显示测试计数为零。所以不是显示测试成功或失败,而是显示没有结果,基本上什么都不做。
我试着通过NUnit代码库,但还没有得出任何好的结论 - 他们大多数方便的方法都希望程序集在文件系统上,所以我想弄清楚如何做到这一点。有任何想法吗?
任何你不能正确地将你的程序集正确放入磁盘并将它们传递给nunit的原因? –
除了我不应该这样做的事实?!我不想依赖文件系统的存在。 –
好的,谢谢,只是在通读代码之前试图理解上下文 –