Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最小起订量和多方法设置_C#_Unit Testing_Moq_Xunit - Fatal编程技术网

C# 最小起订量和多方法设置

C# 最小起订量和多方法设置,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,我试图同时学习MOQ和xUnit的单元测试 我有一个带有几个方法的身份验证逻辑类。它们都使用AuthenticationDataAccessor。我试图模拟访问器,以仅保留对逻辑的单元测试隔离 我试图在我的逻辑类中对两个方法的逻辑进行单元测试 RegisterAsync和authenticatesync private void SetupMocks() { // Mock the data accessor. var _mocke

我试图同时学习MOQ和xUnit的单元测试

我有一个带有几个方法的身份验证逻辑类。它们都使用AuthenticationDataAccessor。我试图模拟访问器,以仅保留对逻辑的单元测试隔离

我试图在我的逻辑类中对两个方法的逻辑进行单元测试

RegisterAsync和authenticatesync

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...));