如何使用xUnit测试byte []数组?

时间:2017-12-22 14:28:34

标签: c# unit-testing xunit.net

我是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。

2 个答案:

答案 0 :(得分:2)

正如注释中指出的那样,数组必须被迭代:

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)
    );
}

答案 1 :(得分:0)

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}");