C#:如何检查我的unit testing中没有发生exception?

我正在为这个返回“void”的方法写一个unit testing。 我想有一个案例,testing通过时,没有exception抛出。 我如何在C#中编写?

Assert.IsTrue(????) 

(我的猜测是这是我应该检查,但什么进入“???”)

我希望我的问题很清楚。

如果抛出exception,你的unit testing将会失败 – 你不需要放置一个特殊的断言。

这是less数情况下你会看到没有断言的unit testing的场景之一 – 如果引发exception,testing将隐式失败。

然而,如果你真的想为此写一个断言 – 也许能够捕捉到exception,并报告“预期没有例外,但得到这个…”,你可以这样做:

 [Test] public void TestNoExceptionIsThrownByMethodUnderTest() { var myObject = new MyObject(); try { myObject.MethodUnderTest(); } catch (Exception ex) { Assert.Fail("Expected no exception, but got: " + ex.Message); } } 

(以上是NUnit的一个例子,但MSTest也是如此)

在NUnit中,你可以使用:

 Assert.DoesNotThrow(<expression>); 

断言你的代码不会抛出exception。 尽pipe如果即使在周围没有Assert时抛出exception,testing也会失败,这种方法的价值在于,您可以区分未满足的期望和testing中的错误,并且您可以select添加自定义消息将显示在您的testing输出中。 措辞良好的testing输出可以帮助您find代码中导致testing失败的错误。

我认为这是有效的添加testing,以确保您的代码不抛出exception; 例如,假设您正在validationinput,并且需要将传入的string转换为长整型。 有可能是string为空的情况,这是可以接受的,所以你要确保string转换不会引发exception。 因此会有代码来处理这个情况,如果你没有为它写一个testing,你将会忽略一个重要逻辑的覆盖。

不要testing一些事情不会发生 。 这就像确保代码不会中断 。 这是暗示的,我们都努力争取不间断的,没有错误的代码。 你想写testing吗? 为什么只有一种方法? 难道你不想让你所有的方法被testing,他们不抛出一些例外 ? 接下来的道路,你会得到一个额外的,虚拟的,断言testing你的代码库中的每个方法。 它没有带来任何价值。

当然,如果你的要求是validation方法确实能够捕获exception ,你可以testing一下(或者反转一下;testing它不会抛出应该捕获的东西)。

然而,一般的方法/实践依然完好无损 – 您不会为某些超出testing代码范围的人为/模糊需求编写testing(testing“有效”或“不会抛出”通常是这样 – 特别是在方法的责任众所周知的情况下)。

简单地说 – 把重点放在你的代码必须做的事情上,为此进行testing。

这个帮助类使用MSTest来抓我的痒。 也许它也可以抓你的。

 [TestMethod] public void ScheduleItsIneligibilityJob_HasValid_CronSchedule() { // Arrange var factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler(); // Assert AssertEx.NoExceptionThrown<FormatException>(() => // Act _service.ScheduleJob(scheduler) ); } public sealed class AssertEx { public static void NoExceptionThrown<T>(Action a) where T:Exception { try { a(); } catch (T) { Assert.Fail("Expected no {0} to be thrown", typeof(T).Name); } } } 

我喜欢看到一个Assert.Whatever 。每个testing结束时,为了一致性…没有一个,我真的可以肯定,那里不应该有一个?

对我来说,这就像把Assert.IsTrue(true);

知道我并没有意外地把那些代码放在那里,所以我应该有足够的信心通过这个意图。

  [TestMethod] public void ProjectRejectsGappedVersioningByDefault() { var files = new List<ScriptFile>(); files.Add(ScriptProjectTestMocks.GetVersion1to2()); files.Add(ScriptProjectTestMocks.GetVersion3to4()); Assert.Throws<ScriptProject.InvalidProjectFormatException>(() => { var sut = new ScriptProject(files); }); } [TestMethod] public void ProjectAcceptsGappedVersionsExplicitly() { var files = new List<ScriptFile>(); files.Add(ScriptProjectTestMocks.GetVersion1to2()); files.Add(ScriptProjectTestMocks.GetVersion3to4()); var sut = new ScriptProject(files, true); Assert.IsTrue(true); // Assert.Pass() would be nicer... build it in if you like }