我是C#单元测试和xUnit的新手。测试byte[]
阵列的正确方法是什么?
我正在尝试再次测试原始数据包以反对原始数据包。
[Fact]
public void DiscoverTest()
{
// DHCP Discover packet (#1) from
// https://wiki.wireshark.org/DHCP
// https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=view&target=dhcp.pcap
// Ethernet and UDP metadata stripped
byte[] b = new byte[]
{
0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x3d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0b, 0x82, 0x01, 0xfc, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
0x53, 0x63, 0x35, 0x01, 0x01, 0x3d, 0x07, 0x01, 0x00, 0x0b, 0x82, 0x01, 0xfc, 0x42,
0x32, 0x04, 0x00, 0x00, 0x00, 0x00, 0x37, 0x04, 0x01, 0x03, 0x06, 0x2a, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// raw byte[] to object's properties etc
DHCPPacket p = new DHCPPacket(b);
// p.GetRawBytes() object properties etc to raw byte[]
Assert.Equal<byte[]>(b, p.GetRawBytes());
}
这给出了:
Assert.Equal() Failure
Expected: Byte[] [1, 1, 6, 0, 0, ...]
Actual: Byte[] [1, 1, 6, 0, 0, ...]
所以我看不出哪个偏移数据实际上是错误的。
什么是正确的方法?
我正在使用xUnit 2.2.0。
正如注释中指出的那样,数组必须是迭代的:
byte[] pb = new DHCPPacket(b).GetRawBytes();
for (int i = 0; i < b.Length; i++)
{
byte expected = b[i];
byte actual = pb[i];
Assert.True(expected == actual,
String.Format("Expected: '{0}', Actual: '{1}' at offset {2}.", (byte)expected, (byte)actual, i)
);
}
XUnit中的单元测试在第一个断言时失败。如果你做长度断言,你将能够分辨出哪个长度是关闭的。
Assert.Equal(b.Length, p.GetRawBytes().Length);
Assert.Equal<byte[]>(b, p.GetRawBytes());
Assert.Equal
也会选择第三个参数,以便在测试失败时打印。所以你可以说:
Assert.Equal(b.Length, p.GetRawBytes().Length, $"Byte array lengths different. Expected: {b.length}, Actual: {p.GetRawBytes().Length}");