Mocking Azure MobileServiceClient












2














I have a method I need to Unittest and I am stuck with mocking part of it.



private async void LoginCommandAsync()
{

.....

CancellationToken ct;
var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct);

....
}


I tried to mock the Microsoft.WindowsAzure.MobileServices.MobileServiceClient using Moq. Unfortunatly I always get a System.InvalidCastException in the last code line



        var currentClient = new Mock<IMobileServiceClient>(MockBehavior.Loose);

currentClient.Setup(x => x.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct)).Returns(Task.FromResult(token));

var disposableCurrentClient = currentClient.As<IDisposable>();

ClientAuthorizationService.CurrentClient = (MobileServiceClient)disposableCurrentClient.Object;


MobileServiceClient inherits from IMobileServiceClient, IDisposable but no matter how I try to use/assign the mocked object... it does not work.



public class ClientAuthorizationService : IClientAuthorizationService
{
public MobileServiceClient CurrentClient { get; set; }
public ClientAuthorizationService()
{
CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
}
}









share|improve this question
























  • You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
    – Nkosi
    Nov 11 at 20:52










  • What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
    – Nkosi
    Nov 11 at 20:58










  • I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
    – Oliver Martins
    Nov 11 at 22:58












  • edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
    – Nkosi
    Nov 11 at 22:59












  • as suggested, I edited my original question. Let me know if you need more information
    – Oliver Martins
    Nov 11 at 23:31
















2














I have a method I need to Unittest and I am stuck with mocking part of it.



private async void LoginCommandAsync()
{

.....

CancellationToken ct;
var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct);

....
}


I tried to mock the Microsoft.WindowsAzure.MobileServices.MobileServiceClient using Moq. Unfortunatly I always get a System.InvalidCastException in the last code line



        var currentClient = new Mock<IMobileServiceClient>(MockBehavior.Loose);

currentClient.Setup(x => x.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct)).Returns(Task.FromResult(token));

var disposableCurrentClient = currentClient.As<IDisposable>();

ClientAuthorizationService.CurrentClient = (MobileServiceClient)disposableCurrentClient.Object;


MobileServiceClient inherits from IMobileServiceClient, IDisposable but no matter how I try to use/assign the mocked object... it does not work.



public class ClientAuthorizationService : IClientAuthorizationService
{
public MobileServiceClient CurrentClient { get; set; }
public ClientAuthorizationService()
{
CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
}
}









share|improve this question
























  • You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
    – Nkosi
    Nov 11 at 20:52










  • What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
    – Nkosi
    Nov 11 at 20:58










  • I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
    – Oliver Martins
    Nov 11 at 22:58












  • edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
    – Nkosi
    Nov 11 at 22:59












  • as suggested, I edited my original question. Let me know if you need more information
    – Oliver Martins
    Nov 11 at 23:31














2












2








2


0





I have a method I need to Unittest and I am stuck with mocking part of it.



private async void LoginCommandAsync()
{

.....

CancellationToken ct;
var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct);

....
}


I tried to mock the Microsoft.WindowsAzure.MobileServices.MobileServiceClient using Moq. Unfortunatly I always get a System.InvalidCastException in the last code line



        var currentClient = new Mock<IMobileServiceClient>(MockBehavior.Loose);

currentClient.Setup(x => x.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct)).Returns(Task.FromResult(token));

var disposableCurrentClient = currentClient.As<IDisposable>();

ClientAuthorizationService.CurrentClient = (MobileServiceClient)disposableCurrentClient.Object;


MobileServiceClient inherits from IMobileServiceClient, IDisposable but no matter how I try to use/assign the mocked object... it does not work.



public class ClientAuthorizationService : IClientAuthorizationService
{
public MobileServiceClient CurrentClient { get; set; }
public ClientAuthorizationService()
{
CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
}
}









share|improve this question















I have a method I need to Unittest and I am stuck with mocking part of it.



private async void LoginCommandAsync()
{

.....

CancellationToken ct;
var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct);

....
}


I tried to mock the Microsoft.WindowsAzure.MobileServices.MobileServiceClient using Moq. Unfortunatly I always get a System.InvalidCastException in the last code line



        var currentClient = new Mock<IMobileServiceClient>(MockBehavior.Loose);

currentClient.Setup(x => x.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct)).Returns(Task.FromResult(token));

var disposableCurrentClient = currentClient.As<IDisposable>();

ClientAuthorizationService.CurrentClient = (MobileServiceClient)disposableCurrentClient.Object;


MobileServiceClient inherits from IMobileServiceClient, IDisposable but no matter how I try to use/assign the mocked object... it does not work.



public class ClientAuthorizationService : IClientAuthorizationService
{
public MobileServiceClient CurrentClient { get; set; }
public ClientAuthorizationService()
{
CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
}
}






c# unit-testing moq azure-mobile-services






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 11 at 23:48









Nkosi

110k16117184




110k16117184










asked Nov 11 at 18:45









Oliver Martins

204




204












  • You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
    – Nkosi
    Nov 11 at 20:52










  • What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
    – Nkosi
    Nov 11 at 20:58










  • I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
    – Oliver Martins
    Nov 11 at 22:58












  • edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
    – Nkosi
    Nov 11 at 22:59












  • as suggested, I edited my original question. Let me know if you need more information
    – Oliver Martins
    Nov 11 at 23:31


















  • You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
    – Nkosi
    Nov 11 at 20:52










  • What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
    – Nkosi
    Nov 11 at 20:58










  • I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
    – Oliver Martins
    Nov 11 at 22:58












  • edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
    – Nkosi
    Nov 11 at 22:59












  • as suggested, I edited my original question. Let me know if you need more information
    – Oliver Martins
    Nov 11 at 23:31
















You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
– Nkosi
Nov 11 at 20:52




You are mocking IMobileServiceClient at no point is that interface going to be a MobileServiceClient class. This feels like an XY problem. What are you actually trying to do?
– Nkosi
Nov 11 at 20:52












What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
– Nkosi
Nov 11 at 20:58




What is ClientAuthorizationService and ClientAuthorizationService.CurrentClient?
– Nkosi
Nov 11 at 20:58












I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
– Oliver Martins
Nov 11 at 22:58






I am trying to Mock the MobileServiceClient because of the InvokeApiAsync that occurs in a method that I need to unittest. Currently the CurrentClient of type MobileServiceClient is a member/property of the ClientAuthorizationService which is an own implementation of the IClientAuthorizationService with no other dependencies
– Oliver Martins
Nov 11 at 22:58














edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
– Nkosi
Nov 11 at 22:59






edit the question with a Minimal, Complete, and Verifiable example the properly represents the problem to be solved so we can better help you.
– Nkosi
Nov 11 at 22:59














as suggested, I edited my original question. Let me know if you need more information
– Oliver Martins
Nov 11 at 23:31




as suggested, I edited my original question. Let me know if you need more information
– Oliver Martins
Nov 11 at 23:31












1 Answer
1






active

oldest

votes


















1














Change ClientAuthorizationService.CurrentClient member/property from MobileServiceClient to IMobileServiceClient



public interface IClientAuthorizationService  {
IMobileServiceClient CurrentClient { get; set; }
}

public class ClientAuthorizationService : IClientAuthorizationService {

public ClientAuthorizationService() {
CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
}

public IMobileServiceClient CurrentClient { get; set; }
}


This will allow for a mock of the client to be assigned when testing as ClientAuthorizationService is now dependent on abstractions and not implementation concerns.



//....

var clientAuthorizationService = new Mock<IClientAuthorizationService>();

var currentClient = new Mock<IMobileServiceClient>();

currentClient
.Setup(_ => _.InvokeApiAsync(It.IsAny<string>(), null, HttpMethod.Get, null, It.IsAny<CancellationToken>()))
.ReturnsAsync(token);

clientAuthorizationService
.Setup(_ => _.CurrentClient)
.Returns(currentClient.Object);

//.....


Also it is advised not to use async void except for event handlers



So the code under test needs to be updated accordingly.



private async Task LoginCommandAsync() {

//.....

CancellationToken ct;
var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
null, HttpMethod.Get, null, ct);

//....
}





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53251995%2fmocking-azure-mobileserviceclient%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Change ClientAuthorizationService.CurrentClient member/property from MobileServiceClient to IMobileServiceClient



    public interface IClientAuthorizationService  {
    IMobileServiceClient CurrentClient { get; set; }
    }

    public class ClientAuthorizationService : IClientAuthorizationService {

    public ClientAuthorizationService() {
    CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
    }

    public IMobileServiceClient CurrentClient { get; set; }
    }


    This will allow for a mock of the client to be assigned when testing as ClientAuthorizationService is now dependent on abstractions and not implementation concerns.



    //....

    var clientAuthorizationService = new Mock<IClientAuthorizationService>();

    var currentClient = new Mock<IMobileServiceClient>();

    currentClient
    .Setup(_ => _.InvokeApiAsync(It.IsAny<string>(), null, HttpMethod.Get, null, It.IsAny<CancellationToken>()))
    .ReturnsAsync(token);

    clientAuthorizationService
    .Setup(_ => _.CurrentClient)
    .Returns(currentClient.Object);

    //.....


    Also it is advised not to use async void except for event handlers



    So the code under test needs to be updated accordingly.



    private async Task LoginCommandAsync() {

    //.....

    CancellationToken ct;
    var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
    null, HttpMethod.Get, null, ct);

    //....
    }





    share|improve this answer




























      1














      Change ClientAuthorizationService.CurrentClient member/property from MobileServiceClient to IMobileServiceClient



      public interface IClientAuthorizationService  {
      IMobileServiceClient CurrentClient { get; set; }
      }

      public class ClientAuthorizationService : IClientAuthorizationService {

      public ClientAuthorizationService() {
      CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
      }

      public IMobileServiceClient CurrentClient { get; set; }
      }


      This will allow for a mock of the client to be assigned when testing as ClientAuthorizationService is now dependent on abstractions and not implementation concerns.



      //....

      var clientAuthorizationService = new Mock<IClientAuthorizationService>();

      var currentClient = new Mock<IMobileServiceClient>();

      currentClient
      .Setup(_ => _.InvokeApiAsync(It.IsAny<string>(), null, HttpMethod.Get, null, It.IsAny<CancellationToken>()))
      .ReturnsAsync(token);

      clientAuthorizationService
      .Setup(_ => _.CurrentClient)
      .Returns(currentClient.Object);

      //.....


      Also it is advised not to use async void except for event handlers



      So the code under test needs to be updated accordingly.



      private async Task LoginCommandAsync() {

      //.....

      CancellationToken ct;
      var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
      null, HttpMethod.Get, null, ct);

      //....
      }





      share|improve this answer


























        1












        1








        1






        Change ClientAuthorizationService.CurrentClient member/property from MobileServiceClient to IMobileServiceClient



        public interface IClientAuthorizationService  {
        IMobileServiceClient CurrentClient { get; set; }
        }

        public class ClientAuthorizationService : IClientAuthorizationService {

        public ClientAuthorizationService() {
        CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
        }

        public IMobileServiceClient CurrentClient { get; set; }
        }


        This will allow for a mock of the client to be assigned when testing as ClientAuthorizationService is now dependent on abstractions and not implementation concerns.



        //....

        var clientAuthorizationService = new Mock<IClientAuthorizationService>();

        var currentClient = new Mock<IMobileServiceClient>();

        currentClient
        .Setup(_ => _.InvokeApiAsync(It.IsAny<string>(), null, HttpMethod.Get, null, It.IsAny<CancellationToken>()))
        .ReturnsAsync(token);

        clientAuthorizationService
        .Setup(_ => _.CurrentClient)
        .Returns(currentClient.Object);

        //.....


        Also it is advised not to use async void except for event handlers



        So the code under test needs to be updated accordingly.



        private async Task LoginCommandAsync() {

        //.....

        CancellationToken ct;
        var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
        null, HttpMethod.Get, null, ct);

        //....
        }





        share|improve this answer














        Change ClientAuthorizationService.CurrentClient member/property from MobileServiceClient to IMobileServiceClient



        public interface IClientAuthorizationService  {
        IMobileServiceClient CurrentClient { get; set; }
        }

        public class ClientAuthorizationService : IClientAuthorizationService {

        public ClientAuthorizationService() {
        CurrentClient = new MobileServiceClient(Constants.ApiConstants.ApplicationUrl);
        }

        public IMobileServiceClient CurrentClient { get; set; }
        }


        This will allow for a mock of the client to be assigned when testing as ClientAuthorizationService is now dependent on abstractions and not implementation concerns.



        //....

        var clientAuthorizationService = new Mock<IClientAuthorizationService>();

        var currentClient = new Mock<IMobileServiceClient>();

        currentClient
        .Setup(_ => _.InvokeApiAsync(It.IsAny<string>(), null, HttpMethod.Get, null, It.IsAny<CancellationToken>()))
        .ReturnsAsync(token);

        clientAuthorizationService
        .Setup(_ => _.CurrentClient)
        .Returns(currentClient.Object);

        //.....


        Also it is advised not to use async void except for event handlers



        So the code under test needs to be updated accordingly.



        private async Task LoginCommandAsync() {

        //.....

        CancellationToken ct;
        var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,
        null, HttpMethod.Get, null, ct);

        //....
        }






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 11 at 23:55

























        answered Nov 11 at 23:47









        Nkosi

        110k16117184




        110k16117184






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53251995%2fmocking-azure-mobileserviceclient%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            Tangent Lines Diagram Along Smooth Curve

            Yusuf al-Mu'taman ibn Hud

            Zucchini