我正在编写一个单元测试,并试图设置一个包含实体类模拟的简单通用列表......
Dim schedules = New List(Of Schedule) From
{
Mock.Of(Of Schedule)(Function(s) s.ActiveFrom = "2010-01-01" AndAlso
s.ActiveUntil = New DateTime?("2110-01-01"))
}
Schedule.ActiveFrom
是Date
,Schedule.ActiveUntill
是Nullable(Of Date)
。
当我运行单元测试时,我收到以下错误消息......
二进制运算符AndAlso未定义类型&System; Nullable [System.Boolean]>和System.Boolean
我很难过;我哪里错了?
答案 0 :(得分:0)
问题是你实际上有两种不同的类型。 VB无法处理。因此,您希望捕获可空部分,如果它为null,则返回一个直布尔值。
你可以做的一件事就是改变:
s.ActiveUntil = New DateTime?("2110-01-01")
到
if(s.ActiveUntil is Nothing, FALSE, s.ActiveUntil = New DateTime?("2110-01-01"))
这样,如果字段为null,则返回一个简单的布尔值,如果它不为null,则可以返回比较的布尔结果。
答案 1 :(得分:0)
这对你的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
的{{3}}有关 - 可能在VB中有Mock.Of's usage的细微差别。
如果是这样,并且假设您不想将单元测试更改为C#,则可能需要wasn't considered才能获得Mock.Of(predicate)
良好的工作,或者恢复旧样式创建你的Mock / Fake对象:
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")