如何从自定义比较中获得有关失败的更详细信息

本文关键字:失败 详细信息 自定义 比较 | 更新日期: 2023-09-27 18:00:01

我为下面的对象构建了自己的比较,以便在测试中使用。它按当前状态工作,并在其中一个比较字段不匹配时传递错误值。有没有一种方法可以让我更详细地了解比较在哪个领域失败?

[DataContract]
public class Stats : IEquatable<Stats>
{
    [DataMember]
    public string StatusCode { get; set; }
    [DataMember]
    public int ProspectCount { get; set; }
    [DataMember]
    public int MessageCount { get; set; }
    [DataMember]
    public int NewListingCount { get; set; }
    [DataMember]
    public int ReminderCount { get; set; }
    [DataMember]
    public int MyListingCount { get; set; }
    [DataMember]
    public int OfficeListingCount { get; set; }
    public bool Equals(Stats other)
    {
        if (Object.ReferenceEquals(other, null)) return false;
        if (Object.ReferenceEquals(this, other)) return true;
        return StatusCode.Equals(other.StatusCode) &&
               ProspectCount.Equals(other.ProspectCount) &&
               MessageCount.Equals(other.MessageCount) &&
               NewListingCount.Equals(other.NewListingCount) &&
               ReminderCount.Equals(other.ReminderCount) &&
               MyListingCount.Equals(other.MyListingCount) &&
               OfficeListingCount.Equals(other.OfficeListingCount);
    }
}

测试:

[Theory]
[ExcelData("Stats.xls", "Select * from TestData")]
public void GoodDataTests(int SubscriptionId, int ProfileId, int ClientID, string statusCode, int prospectCount,
    int messageCount, int newListingCount, int reminderCount, int myListingCount, int officListingCount)
{
    DataContainers.Stats expectedStats = new DataContainers.Stats{
        StatusCode = statusCode,
        ProspectCount = prospectCount,
        MessageCount = messageCount,
        NewListingCount = newListingCount,
        ReminderCount = reminderCount,
        MyListingCount = myListingCount,
        OfficeListingCount = officListingCount
    };    
    string url = Utils.CreateStatisticsUrlRequest(SubscriptionId,ProfileId,ClientID);
    string response = Utils.GetResponseBody(url);
    DataContainers.Stats results = JsonConvert.DeserializeObject<DataContainers.Stats>(response);
    Assert.Equal(expectedStats, results);
}

我当前从xunit输出的故障如下:

测试名称:GoodDataTests测试全名:ThunderBallApiTests.StatisticsTests.GoodDataTests测试源:''sky.dom''mlfile1''users''DanS''My Documents''Visual Studio 2012''Projects''ThunderBallApiTests''ThunderbalApiTestes''StatisticsTests.cs:line 20测试结果:失败测试持续时间:0:00:20.203

Result1名称:GoodDataTests(订阅ID:167769,配置文件ID:1571394,客户端ID:1234,状态代码:"活动",prospectCount:54,messageCount:17,newListingCount:0,reminderCount:33,myListingCount=0,officListingCount:2)Result1结果:失败结果1持续时间:0:00:01.471结果1消息:
Assert.Equal()失败预期:ThunderBallApiTests.DataContainers.Stats实际:ThunderBallApiTests.DataContainers.StatsResult1 StackTrace:在ThunderBallApiTests.StatisticsTests.StatisticsGoodDataTests(Int32 SubscriptionId、Int32 ProfileId、Int32Id、String statusCode、Int32 prospectCount、Int32 messageCount、Int32newListingCount、Int32-reminderCount、Int32myListingCount和Int32officListingCount)中''sky.dom''mlfile1''users''DanS''My Documents''Visual Studio2012''Projects''ThunderBallApiTests''ThunderbalApiTestes''StatisticsTests.cs:line 36

如何从自定义比较中获得有关失败的更详细信息

请注意,在数据契约上进行相等操作通常不是一件好事。xUnit测试模式书在这个领域提供了很好的一般性建议和模式。这本书涵盖了特定测试的平等和平等污染的概念。它还具有自定义断言的概念,可以满足您的需求(假设生产代码中不直接需要相等)。

其他有用的技巧有:

  • 覆盖ToStringAssert.Equal将免费提供更好的诊断(您可以使用CR或R#tem[板来这样做)
  • 映射到Tuple或匿名类并免费获得所述ToString impl

就自动化此类内容的工具而言,您可以使用AutoFixture的Likeness(对于这种情况来说,这太过分了,但对于映射器来说可能非常好,是一个值得注意的潜在金锤;)。此外,如果你用F#编写测试(你真的应该),你可以依靠unquote。

我认为这实际上混淆了两个概念——比较和测试。相等性的"测试"有一个true/false值,但两者都不是"失败"。如果更广泛的场景是两个对象应该相等以满足测试用例,那么如果你发现它们不相等,就测试每个属性的相等性,这将给出你想要的更详细的测试结果。