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

Unit testing 具有复杂参数的Moq设置方法,unit-testing,moq,Unit Testing,Moq,我正在尝试设置此界面的模拟: public interface IAuthenticatedRequestService { HttpClient CreateHttpClientForJwt(Func<HttpResponseMessage, bool> isUnauthenticated, int timeoutSeconds); HttpClient CreateHttpClientForAccessToken(Func<Http

我正在尝试设置此界面的模拟:

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

        HttpClient CreateHttpClientForAccessToken(Func<HttpResponseMessage, bool> isUnauthenticated, int timeoutSeconds);
    }
这是我的单元测试,它设置了模拟:

    [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);
            }
编辑:要清楚,我需要更正的是这行代码:

authenticatedRequestService.Setup(foo => foo.CreateHttpClientForAccessToken((It.IsAny<Func <HttpResponseMessage, bool>>())
                    , 0
                            )).Returns(new HttpClient());
    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;
Mvx.RegisterSingleton<IAuthenticatedRequestService>(authenticatedRequestService.Object);
var service = Mvx.Resolve<IAuthenticatedRequestService>();
我发现这不是最低起订量问题。MvvmCross未注册要正确解析的对象。

此行不起作用:

authenticatedRequestService.Setup(foo => foo.CreateHttpClientForAccessToken((It.IsAny<Func <HttpResponseMessage, bool>>())
                    , 0
                            )).Returns(new HttpClient());
    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;
Mvx.RegisterSingleton<IAuthenticatedRequestService>(authenticatedRequestService.Object);
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)
异步任务UpdateUserDetails()
{
//我们必须延迟解决这个问题,否则我们最终会导致依赖循环
var service=Mvx.Resolve();
尝试
{
var client=service.CreateHttpClientForAccessToken(x=>x.StatusCode==HttpStatusCode.Unauthorized,CoreContents.TimeoutMyDetails);
var user=\u user;
var str=await client.GetStringAsync(新Uri(user.IdUrl));
var newUser=JsonConvert.DeserializeObject(str);
var-token=_-token;
if(令牌!=null)

您可以断言实例loggedInProvider(loggedInProvider类型)的属性但是,我无法在您的示例中使用该类的任何声明。您能提供一个编译示例吗?@flo原始单元测试中实例化了一个LoggedInProvider,但是我已经使用通过的单元测试中的LoggedInProvider粘贴了一些代码。我希望在哪里,这可能能够缩短您的示例以缩小问题向下:-)