访问内部对象以检查它们是否相同

时间:2016-06-21 20:16:17

标签: c# .net unit-testing

我正在进行单元测试,我想声明返回的对象与模型相同。

        var actual = scope.InstanceUnderTest.GetContent(expectedId);
        var newFileStreamer = new FileStreamer(scope.TestDocument.Data, "application/octet-stream");
        Assert.IsTrue(actual.Result.Equals(newFileStreamer));

actual.Result似乎距离与newFileStreamer相同的对象一级:

enter image description here

如何访问内部文件流对象以检查它们是否相同?

3 个答案:

答案 0 :(得分:3)

它不是一个级别,调试器以这种方式显示它,因为它执行强制转换为正确的类型。如果右键单击第二个节点并选择add-watch,您将看到被监视的表达式包含一个强制转换。

要检查内部,您可以使用反射。 请注意不推荐来测试单元测试中的私有字段,但如果您真的想要,请参阅以下代码:

1 0.000000000 02:00:00:00:00:67 -> IPv4mcast_01:05:ee 0x8903 1467 Data Center Ethernet (DCE) protocol(Cisco)
 2 0.000001180 10.81.130.23 -> 239.1.5.238  ST 1451 Messages: 14
 3 0.006327070 02:00:00:00:00:67 -> IPv4mcast_01:05:ee 0x8903 1467 Data Center Ethernet (DCE) protocol(Cisco)
 4 0.006328250 10.81.130.23 -> 239.1.5.238  ST 1451 Messages: 14
 5 0.019039770 02:00:00:00:00:67 -> IPv4mcast_01:05:ee 0x8903 1467 Data Center Ethernet (DCE) protocol(Cisco)

答案 1 :(得分:1)

引用类型的.Equals()的默认行为是检查引用相等性(即它们是否指向堆上的同一对象)。由于您在断言之前实例化了两个对象中的一个,因此无法将它们视为同一个对象(因为其他对象无法在其实例化和断言之间获取对newFileStreamer的引用)。

如果你还没有provided an overload for .Equals的fileStreamer类型,那么你可以通过这样做来解决你的问题,并在方法中说明究竟什么是相同的。

答案 2 :(得分:0)

根据评论,这似乎应该没问题:

if( (FileStreamer)actual.Result == newFileStreamer) {
    //do work here
}

或者我猜

if( (actual.Result as FileStreamer) == newFileStreamer) {
    //do work here
}