使Moq Setup识别一个带有值的数组

本文关键字:一个 数组 Setup Moq 识别 | 更新日期: 2023-09-27 18:15:36

如何使Moq Setup识别具有相同值的两个数组?

我有一个方法,它接受一个字符串列表作为参数。

class Hospital{
    Patient[] GetPatients( DateTime[] dates ){
       ...
    }
}

在需要确切参数的地方设置了一个mock。

var hospital= new Mock<Hospital>( MockBehavior.Strict );
hospital.Setup( m => m.GetPatients( new [] { new DateTime(2016,10,30) } ) );

然后,在我的测试中,我执行调用。

hospital.GetPatients( new [] { date } ); // date is DateTime(2016,10,30).

它不能识别我的mock。
这是很自然的,因为Equals不认为两个数组相等。
但是我要怎么做呢?

使Moq Setup识别一个带有值的数组

也许在你问这个问题的时候,Moq还没有实现这个。但是现在它应该按你写的方式工作了。

Moq不使用简单的. equal()方法来验证值是否相同。它创建了更复杂的匹配。如果它找到IEnumerable则使用。sequenceequal ()

我的解决方案是(意识到这是可能的)把一个lambda在It.IsIt.Is<>( => )

var hospital= new Mock<Hospital>( MockBehavior.Strict );
hospital.Setup( m => m.GetPatients(
    It.Is<DateTime[]>( d => AreEqual(d) ) );

和一个辅助方法

bool AreEqual( DateTime[] dates ){
    return dates.Count == 1
        && dates[0] == new DateTime( 2016, 10, 30 );
}