gpt4 book ai didi

c# - 扩展 xUnit.NET 以在处理类和定位测试方法时使用自定义代码

转载 作者:太空狗 更新时间:2023-10-29 22:07:51 25 4
gpt4 key购买 nike

我是 xUnit.NET 框架的忠实粉丝;我发现它轻巧、简单、干净且可扩展。

现在假设我有这样一个类:

public class AdditionSpecification
{
static int result;

public void Because()
{
result = 2 + 2;
}

public void Result_is_non_zero()
{
Assert.True(result <> 0);
}

public void Result_is_correct()
{
Assert.Equal(4, result);
}
}

对于上面的测试类,我希望 xUnit.NET 查看 2 个测试用例并在每个测试用例之前运行 Because() 方法。

撇开您可能对我的类名或方法名、此测试/规范的结构、xUnit.NET 框架或 BDD 存在的任何问题不谈,这是我的问题:

我如何告诉 xUnit.NET 我想自定义它如何识别和执行此类中的测试方法而不在每个目标测试上使用自定义 [Fact] 类属性方法?

我知道我可以从 BeforeAfterAttribute 派生来在执行前后用自定义装饰每个测试方法。我怎样才能在类里面做到这一点?我必须编写自定义运行程序吗?

最佳答案

xUnit.net 的 IUseFixture 允许您对每个夹具进行设置。因此,您可以定义自己的夹具类:

public class AdditionFixture : IDisposable
{
public int Because()
{
return 2 + 2;
}

public void Dispose()
{
//test tear down code
}
}

然后您的测试类可以实现它(需要实现 setFixture):

public class AdditionSpecification : IUseFixture<AdditionFixture>
{
int result;

public void SetFixture(AdditionFixture Fixture)
{
result = Fixture.Because();
}

[Fact]
public void Result_is_non_zero()
{
Assert.True(result <> 0);
}

[Fact]
public void Result_is_correct()
{
Assert.Equal(4, result);
}
}

xUnit 运行程序将创建您的夹具的单个实例,并在运行每个测试之前将其传递到 SetFixture。运行完所有测试后,如果运行器实现了 IDisposable,运行器将释放该夹具。希望对您有所帮助!

codeplex 上的 xUnit wiki 提供了更多信息,包括一个很好的示例,说明如何实现 IUseFixture 来管理测试装置的数据库连接。

关于c# - 扩展 xUnit.NET 以在处理类和定位测试方法时使用自定义代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488121/

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