C# NUnit: Test-Refactoring

Ivan Shelomentsev
Aug 23, 2017 · 1 min read

Stumbled upon this test:

Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, true));  
Assert.Throws<ArgumentException>(() => new NumberValidator(1, -1, true));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, false));
Assert.Throws<ArgumentException>(() => new NumberValidator(1, -1, false));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true));
Assert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber(null));
Assert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber("")); Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0")); Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0"));
Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.00"));
Assert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber("0.000"));
Assert.IsTrue(new NumberValidator(3, 2, true).IsValidNumber("0.00"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("00.00"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-0.00"));
Assert.IsFalse(new NumberValidator(3, 2, false).IsValidNumber("-0.00"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+0.00"));
Assert.IsTrue(new NumberValidator(4, 2, true).IsValidNumber("+1.23"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+1.23"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd"));
Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("asd"));

And made me etchy. This is one test with 22 assertion which violates several ‘golden rules of testing’, according to which test should:

  • have an AAA (arrange, act, assert) structure,
  • be DRY (don’t repeat yourself) — KISS (Keep it simple&stupid),
  • act as specification,
  • have clear name and/or description.

So, I separated assertion according to their purpose, gave then names and description (to some of them).

And this is how it looks like now:


With peace in my heart I went on my business.

Thanks for reading!

)
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade