使Moq Setup识别带有值的数组

时间:2016-10-30 09:13:23

标签: c# moq

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

我有这个方法,它将字符串列表作为参数。

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

我设置了一个模拟,我需要确切的参数。

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).

它无法识别我的模拟 这是很自然的,因为Equals不认为两个数组相等 但是我该怎么做呢?

2 个答案:

答案 0 :(得分:0)

我的解决方案是(意识到可以)将lambda放在It.Is It.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.Counts == 1
        && dates[0] == new DateTime( 2016, 10, 30 );
}

答案 1 :(得分:0)

也许在您问这个问题时,Moq尚未实现。但是现在它应该可以按照您的书写方式工作了。

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

由于数组是无数的,因此它应该对您有用。