代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何模拟返回任务(IList(PasswordChangeHistory))的异步方法

  •  1
  • Andrew  · 技术社区  · 7 年前

    这就是我想要模仿的方法:

    Function ReturnPasswordHistoryAsync(passwordChangeHistory As PasswordChangeHistory) As Task(Of IList(Of PasswordChangeHistory))
    

    这是我的单元测试:

    <TestMethod()> Public Async Function ValidateNewPassword_NewPasswordHasAlreadyBeenUsed_PasswordIsNotValid() As Task
            'Arrange
            Dim newPass = "newPass"
            Dim oldPass = "oldPass"
            Dim confirmPass = newPass
            Dim passwordValid As PasswordValid
            Dim ret As Task(Of IList(Of PasswordChangeHistory))
    
            'Errors here with null object reference error
            _mockChangePasswordRepo.Setup(Function(x) x.ReturnPasswordHistoryAsync(New PasswordChangeHistory())).Returns(ret)
    
            'Act
            passwordValid = Await _changePasswordManager.ValidateNewPassword(oldPass, newPass, confirmPass, Nothing)
    
            'Assert
            Assert.IsFalse(passwordValid.IsValid, "New password and old passord equal one another yet the test passed")
        End Function
    

    Task(Of IList(Of PasswordChangeHistory))

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nkosi    7 年前

    看起来你正在使用最小起订量。对于模拟异步返回值,可以使用 ReturnsAsync

     Dim ret As IList(Of PasswordChangeHistory) = New List(Of PasswordChangeHistory)
    
     'Setup member to expect any value of PasswordChangeHistory and return a list after an async call
    _mockChangePasswordRepo.Setup(Function(x) x.ReturnPasswordHistoryAsync(It.IsAny(Of PasswordChangeHistory))).ReturnsAsync(ret)
    

    这将允许模拟通过异步/等待调用流动。

        2
  •  1
  •   Andrew    7 年前
    If (results Is Nothing And results.Count > 0) Then
                    Return False
            End If
    

    Nothing 所以我认为IF会计算第二个方面,如果返回false,则跳过第二部分。但事实并非如此,因此计数引发了一个异常。

    这就是修复方法:

      If results IsNot Nothing OrElse results.Count = 0 Then
                Return False
            End If
    

    和-评估双方

    与Or和OrElse类似。