簡體   English   中英

最小起訂量和多種方法設置

[英]Moq and multiple method setup

我正在嘗試同時學習 MOQ 以及使用 xUnit 進行單元測試。

我有一個帶有一些方法的身份驗證邏輯類。 它們都使用 AuthenticationDataAccessor。 我試圖模擬該訪問器以僅保留對邏輯的單元測試隔離。

我正在嘗試對我的邏輯類中的兩個方法的邏輯進行單元測試。

RegisterAsync 和 AuthenticateAsync

private void SetupMocks()
        {
            // Mock the data accessor.
            var _mockedDataAccessor = new Mock<IAuthenticationData>();

            // Moke the call that will go to the mocked data accessor.
            var _mockedAuthenticationRequest = new AuthenticationRequest { Username = It.IsAny<string>(), Password = It.IsAny<string>() };
            var _mockedRegistrationRequest = new RegistrationRequest { Email = It.IsAny<string>(), Password = It.IsAny<string>(), Firstname = It.IsAny<string>(), Surname = It.IsAny<string>()  };

            // Setup the accessor.
            _mockedDataAccessor
                .Setup(x => x
                .AuthenticateAsync(_mockedAuthenticationRequest))
                .ReturnsAsync(
                    new SharedLib.Responses.UserResponse
                    {
                        ResponseState = new SharedLib.Responses.ResponseState
                        {
                            Description = "Moq description",
                            IsSuccess = true,
                            ResponseCode = ResponseCode.OK,
                            SystemError = false
                        }
                    });


            _mockedDataAccessor
                .Setup(x => x
                .RegisterAsync(_mockedRegistrationRequest))
                .ReturnsAsync(
                    new SharedLib.Responses.RegistrationResponse
                    {
                        ResponseState = new SharedLib.Responses.ResponseState
                        {
                            Description = "Moq description",
                            IsSuccess = true,
                            ResponseCode = ResponseCode.OK,
                            SystemError = false
                        }
                    });


            // Create the logic reference based on the mocked data accessor
            _logic = new AuthenticationLogic(_mockedDataAccessor.Object);

        }

所以,我有兩個設置調用。 一種用於我正在模擬的數據訪問器方法。

但是,當我執行單元測試時:

[Fact]
public async void RegisterWithValidDetailsReturnsSuccess()
{
    SetupMocks();

    var result = await _logic.RegisterAsync(new RegistrationRequest
    {
        Email = "a.valid@email.com",
        Firstname = "ValidFirstname",
        Password = "AString@Password123",
        Surname = "AValid Surname",
        TimezoneId = 1
    });

    Assert.Equal(ResponseCode.OK, result.ResponseState.ResponseCode);
}

result始終為空。 我希望它是我在上面的設置中設置的。

請注意,使用我的 Authenticate 模擬的測試有效。 似乎第二次模擬失敗了。

[Fact]
        public async void BlankUsernameReturnsError()
        {
            SetupMocks();

            var result = await _logic.AuthenticateAsync(new AuthenticationRequest
            {
                Password = "AFantastic123Password@",
                Username = "",
            });

            Assert.Equal(ResponseCode.LoginInvalidCredentials, result.ResponseState.ResponseCode);
        }

那個有效。 也許你不能在同一個模擬類上有兩個“設置”? 我需要每次測試都有特定的設置? 也許private void Setup()是一個問題/壞主意?

您遇到的基本問題是:

_mockedDataAccessor
    .Setup(x => x.AuthenticateAsync(_mockedAuthenticationRequest))
    .ReturnsAsync(...));

...告訴 Moq 在AuthenticateAsync()傳遞該確切參數時以某種方式行事。 由於這不是您的測試通過的內容,因此請改為從包羅萬象的場景開始:

_mockedDataAccessor
    .Setup(x => x.AuthenticateAsync(It.IsAny<AuthenticationRequest>()))
    .ReturnsAsync(...));

然后,如果需要,您可以縮小要求,具體取決於您的測試要實現的目標; 例如,當用戶名是“Alice”時,您可以返回一個值,而當它是“Bob”時,您可以返回另一個值:

_mockedDataAccessor
    .Setup(x => x.AuthenticateAsync(It.Is<AuthenticationRequest>(a => a.Username == "Alice")))
    .ReturnsAsync(...one value...));
_mockedDataAccessor
    .Setup(x => x.AuthenticateAsync(It.Is<AuthenticationRequest>(a => a.Username == "Bob")))
    .ReturnsAsync(...something else...));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM