我正在尝试使用反射从控制台应用程序运行nunit测试用例。我得到一个异常,我的catch块没有处理。您能否就如何处理调用的测试方法中的所有异常提出建议?
static void Main(string[] args)
{
// Take all classes of the current assebly to which TestFixture attribute is applied
var testClasses = Assembly.GetExecutingAssembly().GetTypes().Where(c =>
{
var attributes = c.GetCustomAttributes(typeof(TestFixtureAttribute));
return attributes.Any();
});
foreach (var testClass in testClasses)
{
var testMethods = testClass.GetMethods().Where(m =>
{
var attributes = m.GetCustomAttributes(typeof (TestAttribute));
return attributes.Any();
});
var instance = Activator.CreateInstance(testClass);
foreach (var method in testMethods)
{
try
{
Action action = (Action) Delegate.CreateDelegate(typeof (Action),
instance, method);
action();
}
catch (AggregateException ae)
{
Console.WriteLine(ae.Message);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
答案 0 :(得分:0)
目前还不清楚为什么要尝试这样做,因为已经有nunit-console可以从控制台应用程序运行单元测试。目前还不清楚你认为什么例外没有被抓住,但我怀疑它不是你认为的类型。我把你的代码放到一个新的控制台应用程序中,还有一些非常基本的测试:
[TestFixture]
public class SomeFailingTests
{
[Test]
public void Fails()
{
Assert.AreEqual(1, 0);
}
[Test]
[ExpectedException(typeof(ArgumentException))]
public void TestExceptionExpected()
{
}
[Test]
public void TestThrows()
{
throw new InvalidOperationException();
}
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void TestThrowsExpected()
{
throw new InvalidOperationException();
}
}
抛出异常的所有测试都被该行捕获:
catch (Exception e)
这是有道理的,因为他们都没有投掷AggregateException
。我怀疑你正在运行的测试中也没有投掷一个并且也被你的外部捕获物捕获。一个好的开始可能是将此块重写为:
catch (Exception e)
{
Console.WriteLine(string.Format("{0}: {1}", e.GetType().Name, e.Message));
}
这样您就可以看到任何未处理的异常类型。在最基本的层面上,您可能需要考虑AssertionException
,例如。
如果你想支持与其他nunit跑步者类似的功能集,你还需要注意你运行的任何方法的ExpectedException
属性,并检查你是否抛出该异常调用方法。您还需要检查Ignored
属性...
正如我在this question的回答中所提到的,如果你想捕捉所有测试属性,你可能需要注意TestCase
和TestCaseSource
组装中的测试。
除非您将此作为学习练习,否则您可能需要重新考虑您的方法。