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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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测试项目提供,没法为其它测试项目实现自定义断言。

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

以上是关于使用C#为MSTest测试项目实现自定义断言的主要内容,如果未能解决你的问题,请参考以下文章

C# 创建一个简单的单元测试实例(MSTest框架)

VS2010 自定义代码分析规则

是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?

C# fluent 断言检查结果为 bool

如何从 MSTest 对站点进行灯塔审计

如何使用 MSTest 测试异步代码