有没有一种简单的方法可以将所有对象属性作为字符串获取?

时间:2015-03-10 17:02:59

标签: c# unit-testing

我有一个名为ReportToDownload的类,它包含多个属性。在测试的Assert部分,我使用我编写的相等比较器比较ReportToDownload的预期和实际列表。对于任何不匹配的项目,我希望使用以下内容打印出预期和实际项目的内容作为消息的一部分:

actual[i].ToString()

但这只返回对象的名称 - ReportToDownload。有没有办法轻松地将对象的全部内容作为字符串?

3 个答案:

答案 0 :(得分:1)

取决于向谁显示,一个简单的"没有努力"解决方案是使用JSON:

Install-Package Newtonsoft.Json

则...

JsonConvert.SerializeObject(actual[i])

答案 1 :(得分:1)

使用单元测试的框架内置断言方法编写一个比较每个属性的方法,而不是使用相等比较,例如:

public void AssertEquals(ReportToDownload actual, ReportToDownload expected)
{
    Assert.That(actual.PropertyA, Is.EqualTo(expected.PropertyA));
    Assert.That(actual.PropertyB, Is.EqualTo(expected.PropertyB));
}

当存在比较失败时,内置断言方法将适当地打印预期值和实际值。

最有可能的是,您的单元测试框架还允许您编写自己的断言,以便在必要时以自定义方式打印差异。

答案 2 :(得分:0)

我不知道这有多大用处,但这是我的看法:

public class ClassA
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }

    public override string ToString()
    {
        string ret = string.Empty;

        foreach (PropertyInfo pi in this.GetType().GetProperties())
        {
            ret += string.Format("{0}: {1}\r\n", pi.Name, pi.GetValue(this, null).ToString());
        }

        return ret;
    }
}

像这样使用:

ClassA a = new ClassA();
a.Prop1 = "Hello";
a.Prop2 = "World";

var toStringOutput = a.ToString();

您可能必须处理更复杂的属性类型,但对于基本类型,这应该有用。