这对您的 VB 单元测试没有多大帮助,但 C# 等效项可以正常工作:
var schedules = new List<Schedule>
{
Mock.Of<Schedule>(
s => s.ActiveFrom == new DateTime(2010, 01, 01)
&& s.ActiveUntil == new Nullable<DateTime>(new DateTime(2110, 01, 01)))
};
Assert.IsTrue((schedules.Count == 1) &&
schedules.Single(_ => (_.ActiveFrom == new DateTime(2010, 01, 01))
&& (_.ActiveUntil == new DateTime(2110, 01, 01))) != null);
这也与DateTime 与DateTime? 的隐式比较无关,因为仔细解包DateTime? 也会失败:
AndAlso If(Not s.ActiveUntil.HasValue, False,
s.ActiveUntil.Value = New DateTime("2110-01-01")
我相信这个问题可能与在从提供的谓词构造模拟期间解析的Expressions 的Mock.Of's usage 相关 - VB 中可能存在细微差别 wasn't considered。
如果是这样,并且假设您不想将单元测试更改为 C#,您可能需要 build the Expressions by hand 才能使 Mock.Of(predicate) 正常工作,或者恢复为旧样式的 Mock 创建/ 假对象:
Dim scheduleMock As New Mock(Of Schedule)
scheduleMock.SetupGet(Function(s) s.ActiveFrom).Returns("2010-01-01")
scheduleMock.SetupGet(Function(s) s.ActiveUntil).Returns(New DateTime?("2110-01-01"))
Dim schedules = New List(Of Schedule) From
{
scheduleMock.Object
}
Assert.IsTrue(schedules.Count = 1)
Assert.IsTrue(schedules.First.ActiveFrom = "2010-01-01"
AndAlso schedules.First.ActiveUntil = "2110-01-01")