Moq - 具有复杂参数的设置方法

时间:2015-11-04 19:38:18

标签: unit-testing moq

我试图设置这个界面的模拟:

public interface IAuthenticatedRequestService
    {
        HttpClient CreateHttpClientForJwt(Func<HttpResponseMessage, bool> isUnauthenticated, int timeoutSeconds);

        HttpClient CreateHttpClientForAccessToken(Func<HttpResponseMessage, bool> isUnauthenticated, int timeoutSeconds);
    }

这是正在使用和工作的设置方法的一个实现:

public HttpClient CreateHttpClientForAccessToken(Func<HttpResponseMessage, bool> isUnauthenticated, int timeoutSeconds)
        {
            var client = Mvx.Resolve<IPlatformOperationProvider>().CreateHttpClient(timeoutSeconds);
            return new HttpClient(new AuthenticatedHttpMessageHandler(this, client, AuthenticationUtils.AddAccessTokenToRequest, isUnauthenticated,_loggingService));
        }

这是已实施方法的一种用法:

var client = service.CreateHttpClientForAccessToken(x => x.StatusCode == HttpStatusCode.Unauthorized, CoreConstants.TimeoutMyDetails);

这是我设置模拟的单元测试:

    [Test]
            public async void TestIsLoggedInIsTrue()
            {
                //Arrange
                var authenticatedRequestService = new Mock<IAuthenticatedRequestService>();
                authenticatedRequestService.Setup(foo => foo.CreateHttpClientForAccessToken((It.IsAny<Func <HttpResponseMessage, bool>>())
                , 0
                        )).Returns(new HttpClient());

                var platformOperationProvider = new Mock<IPlatformOperationProvider>();
                platformOperationProvider.Setup(foo => foo.CreateHttpClient(1)).Returns(new HttpClient());

                Mvx.RegisterSingleton<IPlatformOperationProvider>(platformOperationProvider.Object);


                Mvx.RegisterSingleton<IAuthenticatedRequestService>(authenticatedRequestService.Object);

                var loggedInProvider = new LoggedInProvider(
                    new Mock<ISecuredSettings>().Object,
                    new Mock<ILoggingService>().Object
                    );

                //Act
                await loggedInProvider.SetUserAndToken(
                    new User(), 
                    new ApiAccessInfo("refresh token", "access token", "jwt")
                    );

                //Assert
                Assert.IsTrue(loggedInProvider.IsLoggedIn);
            }

这个单元测试没有错误,但是测试失败了(我认为这是因为我传递了任何HttpResponseMessage?我需要以某种方式传递它HttpStatusCode.Accepted?我该怎么办?

注意方法的用法,它如何通过HttpStatusCode.Unauthorized,然后我可以用HttpStatusCode.Accepted做那样的事情吗?:

var client = service.CreateHttpClientForAccessToken(x => x.StatusCode == HttpStatusCode.Unauthorized, CoreConstants.TimeoutMyDetails);

编辑:要清楚,我需要更正这一行代码:

authenticatedRequestService.Setup(foo => foo.CreateHttpClientForAccessToken((It.IsAny<Func <HttpResponseMessage, bool>>())
                    , 0
                            )).Returns(new HttpClient());

编辑:虽然从这里开始调试问题(检查创建client后的代码注释):

    async Task<ServiceResponse> UpdateUserDetails()
            {
                // Have to late-resolve this otherwise we end up with a dependency loop
                var service = Mvx.Resolve<IAuthenticatedRequestService>();

                try
                {
                    var client = service.CreateHttpClientForAccessToken(x => x.StatusCode == HttpStatusCode.Unauthorized, CoreConstants.TimeoutMyDetails);

// here is the problem, the client is null after this line of code.

                    var user = _user;

我发现它不是Moq问题。 MvvmCross没有注册要正确解析的对象。

此行无效:

Mvx.RegisterSingleton<IAuthenticatedRequestService>(authenticatedRequestService.Object);

因为这一行会创建一个AuthenticatedRequestService,但它不是我做的模拟行:

var service = Mvx.Resolve<IAuthenticatedRequestService>();

以下是解决AuthenticatedRequestService

的一些背景信息
async Task<ServiceResponse> UpdateUserDetails()
        {
            // Have to late-resolve this otherwise we end up with a dependency loop
            var service = Mvx.Resolve<IAuthenticatedRequestService>();

            try
            {
                var client = service.CreateHttpClientForAccessToken(x => x.StatusCode == HttpStatusCode.Unauthorized, CoreConstants.TimeoutMyDetails);

                var user = _user;

                var str = await client.GetStringAsync(new Uri(user.IdUrl));
                var newUser = JsonConvert.DeserializeObject<User.Json>(str);

                var token = _token;
                if (token != null)

0 个答案:

没有答案