我为在测试中使用的以下对象建立了自己的比较。它按当前状态工作,当比较的字段之一不匹配时,将假值传递出去。有什么办法可以让我更详细地了解比较失败的领域?
[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 \ ThunderBallApiTests \ StatisticsTests.cs:第20行
测试结果:失败
测试时间:0:00:20.203
结果1名称:GoodDataTests(订阅ID:167769,ProfileId:1571394,ClientID:1234,statusCode:“有效”,propectCount:54,messageCount:17,newListingCount:0,提醒计数:33,myListingCount:0,officListingCount:2)
结果1结果:失败
结果1持续时间:0:00:01.471
结果1消息:
Assert.Equal()失败
预期:ThunderBallApiTests.DataContainers.Stats
实际:ThunderBallApiTests.DataContainers.Stats
Result1 StackTrace:在ThunderBallApiTests.StatisticsTests.StatisticsGoodDataTests(Int32 SubscriptionId,Int32 ProfileId,Int32 Id,字符串statusCode,Int32profumCount,Int32 messageCount,Int32 newListingCount,Int32提醒计数,Int32 myListingCount,Int32 officListingCount) DanS \ My Documents \ Visual Studio 2012 \ Projects \ ThunderBallApiTests \ ThunderBallApiTests \ StatisticsTests.cs:line 36
最佳答案
请注意,对数据协定进行相等操作通常不会带来好味道。 xUnit Test Patterns Book在此空间中提供了良好的常规建议和模式。该书涵盖了特定于测试的平等和平等污染的概念。它还具有Custom Assertion的概念,可以满足您的需求(假设在生产代码中不直接需要相等性)。
其他有用的技巧是:
覆盖ToString
和Assert.Equal
将免费提供更好的诊断(您可以使用CR或R#tem [plate这样做)
映射到Tuple
或匿名类,并免费获得所说的ToString
impl。
在使此类东西自动化的工具方面,您可以使用AutoFixture's Likeness
(在这种情况下这是过大的选择,但对于映射器可能非常有用,并且是一个值得意识到的潜在金锤;)。另外,如果您使用F#(you really should)编写测试,则可以lean on unquote。
关于c# - 如何通过自定义比较获得有关故障的更多详细信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23275837/