【问题标题】:moq verify method was called with stream of data使用数据流调用最小起订量验证方法
【发布时间】:2021-02-07 10:59:50
【问题描述】:

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

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 的数据相同?

【问题讨论】:

    标签: c# unit-testing moq xunit memorystream


    【解决方案1】:

    我尝试了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 用于简化集合的断言。

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2011-06-11
      • 2012-08-09
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多