gpt4 book ai didi

c# - 使用新断言扩展 XUnit 断言类

转载 作者:太空狗 更新时间:2023-10-29 18:04:40 26 4
gpt4 key购买 nike

我正在尝试通过添加一些 selenium 功能来扩展 xUnit 断言方法

namespace MyProject.Web.Specs.PageLibrary.Extensions
{
public static class AssertExtensions
{
public static void ElementPresent(this Assert assert, ...)
{
if (...)
{
throw new AssertException(...);
}
}
}
}

但是当我尝试使用它时出现这个编译错误。

using MyProject.Web.Specs.PageLibrary.Extensions;    
using Xunit;
...

public void DoSomething()
{
Assert.ElementPresent(...);
}

错误

Error   5   'Xunit.Assert' does not contain a definition for 'ElementPresent'

有谁知道这是否可行或我哪里出错了?

最佳答案

编辑 2 xUnit 2 最终将断言完全移到了一个单独的程序集中。在 NuGet 上有编译包和仅源代码包,Assert 类是部分的,因此通过使用包的仅源版本,Assert 变得非常容易扩展(在 C# 中)。

编辑 为了更完整:xUnit 2 删除了这个扩展点并建议使用“流畅”断言库的扩展方法。


为了完整起见,这里描述了扩展 Assert 的“官方”方式(令人惊讶的是,它根本没有被提及,尽管 Brad Wilson 甚至加入了讨论)。

从 1.5 版开始(根据 Brad 的博客),xUnit.Extensions 通过 AssertionsTestClass 类明确支持这一点。它是这样工作的:

TestClass 有一个名为 Assert 的属性,属于 Assertions 类型,它中继 Xunit.Assert 上的所有方法>。因为 TestClass.Assert 是一个实例,所以您可以通过 Assertions 上的扩展方法向它添加方法:

public static class AssertionsExtensions
{
public static void DeepEquals(this Assertions assertions, XNode expected, XNode actual)
{
assertions.True(XNode.DeepEquals(expected, actual)); // You can also use Assert.True here, there's effectively no difference.
}
}

现在您需要让您的测试类派生自 Xunit.Extensions.TestClass(令人困惑的是,还有 Xunit.TestClass,这不是您想要的),如果您没有明确限定名称,Assert 属性将“隐藏”Xunit.Assert 类型。

在派生自 TestClass 的测试类中,您现在可以使用

Assert.DeepEquals(expectedXml, actualXml);

与内置 xUnit 断言的唯一真正区别(除了 Assert 的语法着色是标识符的语法着色,而不是类型)是当它失败时,您只需得到TrueException,而不是特定的 DeepEqualsException,它可以假设地告诉您比较失败的位置。但当然,您也可以用完全相同的方式构建它。

关于c# - 使用新断言扩展 XUnit 断言类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16194952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com