Linq to Moq - Nullable Types

时间:2014-08-13 10:27:10

标签: vb.net linq unit-testing moq

我正在编写一个单元测试,并试图设置一个包含实体类模拟的简单通用列表......

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.ActiveFromDateSchedule.ActiveUntillNullable(Of Date)

当我运行单元测试时,我收到以下错误消息......

  

二进制运算符AndAlso未定义类型&System; Nullable [System.Boolean]>和System.Boolean


我很难过;我哪里错了?

2 个答案:

答案 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);

它也与DateTimeDateTime?的隐式比较无关,因为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")