C# 最小起订量和多方法设置
我试图同时学习MOQ和xUnit的单元测试 我有一个带有几个方法的身份验证逻辑类。它们都使用AuthenticationDataAccessor。我试图模拟访问器,以仅保留对逻辑的单元测试隔离 我试图在我的逻辑类中对两个方法的逻辑进行单元测试 RegisterAsync和authenticatesyncC# 最小起订量和多方法设置,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,我试图同时学习MOQ和xUnit的单元测试 我有一个带有几个方法的身份验证逻辑类。它们都使用AuthenticationDataAccessor。我试图模拟访问器,以仅保留对逻辑的单元测试隔离 我试图在我的逻辑类中对两个方法的逻辑进行单元测试 RegisterAsync和authenticatesync private void SetupMocks() { // Mock the data accessor. var _mocke
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);
}
结果
始终为空。我希望它是我在上面的设置中设置的
请注意,使用my Authenticate mock的测试是有效的。看来第二个模拟失败了
[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(...));
当AuthenticateTasync()
被传递到确切的参数时,…告诉Moq以某种方式进行操作。由于这不是您的测试通过的内容,因此请改为从全面捕获场景开始:
_mockedDataAccessor
.Setup(x => x.AuthenticateAsync(It.IsAny<AuthenticationRequest>()))
.ReturnsAsync(...));
\u mockedDataAccessor
.Setup(x=>x.AuthenticateAsync(It.IsAny()))
.ReturnsAsync(…);
然后,如果需要,您可以根据您的测试试图实现的目标来缩小需求范围;e、 g.当用户名为“Alice”时,可以返回一个值,当用户名为“Bob”时,可以返回另一个值:
\u mockedDataAccessor
.Setup(x=>x.authenticateSync(It.Is(a=>a.Username==“Alice”))
.ReturnsAsync(…一个值…);
_模拟数据存取器
.Setup(x=>x.authenticateSync(It.Is(a=>a.Username==“Bob”))
.ReturnsAsync(…其他…);
太棒了!这是有道理的。谢谢为我解决了这个问题。
_mockedDataAccessor
.Setup(x => x.AuthenticateAsync(It.IsAny<AuthenticationRequest>()))
.ReturnsAsync(...));
_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...));