如何从自定义比较中获取有关故障的更多详细信息?

时间:2014-04-24 17:30:54

标签: c# xunit xunit.net

我为我的测试中使用的以下对象构建了自己的比较。它的工作原理与当前的情况相同,并在其中一个比较字段不匹配时传递false值。有没有一种方法可以让我更详细地了解比较失败的哪个领域?

[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   测试FullName:ThunderBallApiTests.StatisticsTests.GoodDataTests   测试源:\ sky.dom \ mlfile1 \ users \ DanS \ My Documents \ Visual Studio 2012 \ Projects \ ThunderBallApiTests \ ThunderBallApiTests \ StatisticsTests.cs:第20行   测试结果:失败   测试时间:0:00:20.203

     

Result1名称:GoodDataTests(SubscriptionId:167769,ProfileId:1571394,ClientID:1234,statusCode:&#34; Active&#34;,prospectCount:54,messageCount:17,newListingCount:0,reminderCount:33,myListingCount:0 ,officListingCount:2)   结果1结果:失败   结果1持续时间:0:00:01.471   结果1消息:
  Assert.Equal()失败   预期:ThunderBallApiTests.DataContainers.Stats   实际:ThunderBallApiTests.DataContainers.Stats   Result1 StackTrace:在\ sky.dom \ mlfile1 \ users \中的ThunderBallApiTests.StatisticsTests.StatisticsGoodDataTests(Int32 SubscriptionId,Int32 ProfileId,Int32 Id,String statusCode,Int32 prospectCount,Int32 messageCount,Int32 newListingCount,Int32 reminderCount,Int32 myListingCount,Int32 officListingCount) DanS \ My Documents \ Visual Studio 2012 \ Projects \ ThunderBallApiTests \ ThunderBallApiTests \ StatisticsTests.cs:第36行

2 个答案:

答案 0 :(得分:2)

请注意,对数据协定进行相等操作通常不是很好。 xUnit Test Patterns Book在这个空间提供了很好的一般建议和模式。该书涵盖了特定测试平等和平等污染的概念。它还有Custom Assertion的概念,可以满足您的需求(假设生产代码中不直接需要相等)。

其他有用的技巧是:

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

在自动化这样的东西的工具方面你可以使用AutoFixture's Likeness(这对于这种情况来说太过分了,但对于地图制作者来说可能非常好,并且是值得注意的潜在金锤;)。另外,如果您使用F#(you really should)编写测试,则可以lean on unquote

答案 1 :(得分:0)

我认为这实际上混淆了两个概念 - 比较和测试。对于平等的“测试”具有真/假值,但两者都不是“失败”。如果更广泛的场景是两个对象应该等于满足测试用例,那么如果你发现它们不相等,那么测试每个属性是否相等,这将给你更详细的测试结果。