gpt4 book ai didi

c# - 如何保持单元测试干燥并减少断言

转载 作者:太空狗 更新时间:2023-10-30 00:39:40 24 4
gpt4 key购买 nike

我正在尝试使用 TDD 方法实现一个 web 服务类,它发出一堆 web 请求并解释响应。我将 webrequests 封装在几个接口(interface)中,以便我可以轻松地模拟它们。当通过 webserviceclass 请求某些东西时,实现的方法总是返回一个包含错误对象的特定响应对象。借助此错误对象,用户可以确定请求是否成功,以及具体错误是什么。

在编写了一堆测试之后,我意识到我在Arrange 阶段重复了很多次:

var mock = new Mock<ISomeWebservices>();
var sut = new MyWebServiceClass(mock.Object);
mock.Setup(foo=>foo.SomeRequest(someData)).Returns(@"{""user"": ""12345"",""somedata"": ""60"",""someotherdata"":""2015-09-01T12:00:00.200Z""}");
sut.SomeRequest(someData,s=> response = s);

所有测试的前两行始终相同。 mock 总是有一个 Setup,它返回某些东西或抛出异常。根据我正在测试的请求,我当然必须设置不同的方法。我尝试使用 Autofixture 来解决这个问题,这样我就可以为每个 Web 请求编写一个 ICustomization,但问题是我仍然需要访问 mock 才能进行特定于测试的设置。

另一个问题是Assert 阶段。因为我总是从请求中得到一个错误对象,所以我只在出现预期和错误时断言错误对象。

    Assert.That(response.Error.Type,Is.EqualTo(ErrorInfo.ErrorType.IllegalToken));
Assert.That(response.Error.Message, Is.Not.Null);
Assert.That(response.Error.AdvisedAction, Is.Not.Null);
Assert.That(response.Error.RawData, Is.Not.Null);

因此,如果出现错误,错误对象的某些属性应该始终填写,有些则可以。 (例如,如果错误是由异常触发的,则异常属性不应为 null 等)据我所知,在单元测试中使用多个断言是一种不好的做法,因此我想尽可能避免这种情况。

[编辑]根据评论,拥有多个断言以及重复我提到的编排部分并不是那么糟糕。所以我不会为此使用 Autofixture。

最佳答案

您肯定可以使用 AutoFixture 来减少您在Arrange 阶段所需的样板代码量。它可能看起来像这样:

[Theory, AutoMoqData]
public void Test(
[Frozen]Mock<ISomeWebservices> mock,
MyWebServiceClass sut,
object someData,
object response)
{
mock.Setup(foo => foo.SomeRequest(someData)).Returns(@"{""user"": ""12345"",""somedata"": ""60"",""someotherdata"":""2015-09-01T12:00:00.200Z""}");
sut.SomeRequest(someData, s => response = s);
// Assertions go here...
}

在这里,我不得不猜测 someDataresponse 的类型,但如果它们与 object 不同,您只需声明他们是那种类型的。

在上面的例子中,[AutoMoqData] 属性定义如下:

public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute() :
base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}

所有其他类型和 AutoFixture 功能均来自 AutoFixture.Xunit2AutoFixture.AutoMoq NuGet 包。

当谈到多重断言时,我同意这里其他评论者的观点,它看起来并没有那么糟糕,但本着 GOOS 的精神,您应该听您的测试。在这种特殊情况下,测试似乎在说:response 的相等性比较看起来很重要。如果是这种情况,您可以考虑覆盖 Equalsresponse 上给它 Structural Equality 而不是 Reference Equality

关于c# - 如何保持单元测试干燥并减少断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33787351/

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