[英]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.