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 }