前言
MSTest测试项目为我们实现了断言类Assert
,用于报告代码行为的正确性,比如:
var result = Calculator.Add(1,2);
Assert.AreEqual(3, result);
虽然常用的断言方法已经可以工作。
但是,我们更希望使用自定义断言,这样可以让我们的测试更易读。
实现
要为MSTest编写自定义断言,我们只要为Assert类编写扩展方法。
反编译Assert类的源代码,可以看到断言失败是通过抛出AssertFailedException来指示测试用例失败:
// Microsoft.VisualStudio.TestTools.UnitTesting.Assert
using System.Globalization;
internal static void HandleFail(string assertionName, string message, params object[] parameters)
{
string text = string.Empty;
if (!string.IsNullOrEmpty(message))
{
text = ((parameters != null) ? string.Format(CultureInfo.CurrentCulture, ReplaceNulls(message), parameters) : ReplaceNulls(message));
}
throw new AssertFailedException(string.Format(CultureInfo.CurrentCulture, FrameworkMessages.AssertionFailed, new object[2] { assertionName, text }));
}
我们可以依葫芦画瓢。
例如,实现断言IsType<T>
,用于验证对象是否正是给定的类型:
internal static class AssertExtensions
{
public static void IsType<T>(this Assert assert, object obj)
{
if (obj is T)
{
return;
}
throw new AssertFailedException($@"Assert.That.IsType失败。不是指定的类型{typeof(T)}");
}
}
使用
Assert类提供了That
属性,可以获取Assert类的实例。
因此,只需在测试用例中用Assert.That
访问扩展方法即可:
[TestMethod]
public void TestMethod1()
{
Assert.That.IsType<Class1>("My IO");
}
结论
Assert.That
属性好像只有MSTest测试项目提供,没法为其它测试项目实现自定义断言。
如果你有实现方案,欢迎到公众号后台留言交流!