问题描述
我有一个使用流调用另一个方法的方法。我想测试一下,在第一种方法中插入的数据是在第二种方法中发送的数据。
(?<=\$)($)(.*)(\@string_literal\@$)(?=\$)
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
的数据相同?
解决方法
我尝试过类似 It.Is<MemoryStream>(s=>s.Equals(new MemoryStream(data)))
的方法,但失败了。
在这种情况下,它可以像这样
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 用于简化集合的断言。