使用C#为MSTest测试项目实现自定义断言

前言

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测试项目提供,没法为其它测试项目实现自定义断言。

如果你有实现方案,欢迎到公众号后台留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值