使用数据流调用最小起订量验证方法

moq verify method was called with stream of data

我有一个方法可以使用流调用另一个方法。我想测试第一种方法中插入的数据是否是第二种方法中发送的数据。

public MyMessage Parse(byte[] data)
{
    return myDependency.Read(new MemoryStream(data))
}

在我的测试中,我有如下内容

byte [] mockData = { 116, 101, 115, 116};

sut.Parse(mockData);

mockDependency.Verify(x=>x.Read(...));

现在我的问题是,我应该用什么来代替 ...

我可以做类似 (It.IsAny<MemoryStream>()) 的事情,但实际上并不能验证它是用给定数据调用的。

我尝试了类似 It.Is<MemoryStream>(s=>s.Equals(new MemoryStream(data))) 但失败了。

有没有办法让我测试发送到 Parse 的数据是否与内存流中发送到 Read 的数据相同?

I tried something like It.Is<MemoryStream>(s=>s.Equals(new MemoryStream(data))) but that failed.

在这种情况下,它可以像

那样完成
mockDependency.Verify(_ => _.Read(It.Is<MemoryStream>( s => 
    Enumerable.SequenceEqual(s.ToArray(), data))));

通过比较字节数组

您也可以尝试捕获传递的参数,以便在断言期间更好地检查它

例如

// Arrange
byte [] expectedData = { 116, 101, 115, 116 };
byte [] actualData = null;

//...

mockDependency
    .Setup(_ => _.Read(It.IsAny<MemoryStream>()))
    .Callback((MemoryStream ms) => actualData = ms.ToArray())
    .Returns(/* MyMessage here*/)
    .Verifiable();

// Act
sut.Parse(expectedData);

//Assert
mockDependency.Verify(); //verify that setup was invoked as expected
//using FluentAssertions to check data
actualData.Should().NotBeNull()
.And.BeEquivalentTo(expectedData);

请注意,Fluent Assertions 用于简化集合的断言。