【问题标题】:Linq to Moq - Nullable TypesLinq to Moq - 可空类型
【发布时间】:2014-08-14 22:53:24
【问题描述】:

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

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 定义


我很难过;我哪里错了?

【问题讨论】:

    标签: vb.net linq unit-testing moq


    【解决方案1】:

    这对您的 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")
    

    我相信这个问题可能与在从提供的谓词构造模拟期间解析的ExpressionsMock.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")
    

    【讨论】:

    • 我相信你是对的,我又回到了老风格的mock创作。以下作品:dim sched = Mock.Of(Of Schedule)() Mock.Get(sched).SetupProperty(Function(s) s.ActiveUntil, New Date?("2110-01-01"))
    【解决方案2】:

    问题是你实际上有两种不同的类型。 VB 无法处理。所以你想捕获可为空的部分,如果它为空,则返回一个直接布尔值。

    你可以做的一件事就是改变:

    s.ActiveUntil = New DateTime?("2110-01-01")
    

    if(s.ActiveUntil is Nothing, FALSE, s.ActiveUntil = New DateTime?("2110-01-01"))
    

    这样,如果字段为null,则返回一个简单的boolean,如果不为null,则可以返回比较的boolean结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多