Mocking Azure MobileServiceClient - PullRequest
       21

Mocking Azure MobileServiceClient

0 голосов
/ 11 ноября 2018

У меня есть метод, который мне нужен для Unittest, и я застрял с насмешливой его частью.

private async void LoginCommandAsync()
    {

        .....

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

        ....
    }

Я пытался издеваться над Microsoft.WindowsAzure.MobileServices.MobileServiceClient, используя Moq. К сожалению, я всегда получаю исключение System.InvalidCastException в последней строке кода

        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 наследует от IMobileServiceClient, IDisposable, но независимо от того, как я пытаюсь использовать / назначить макет объекта ... он не работает.

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

1 Ответ

0 голосов
/ 12 ноября 2018

Изменить ClientAuthorizationService.CurrentClient элемент / свойство с MobileServiceClient на 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; }
} 

Это позволит назначать макет клиента при тестировании, поскольку ClientAuthorizationService теперь зависит от абстракций, а не от проблем реализации.

//....

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

//.....

Также рекомендуется не использовать async void за исключением обработчиков событий

Таким образом, тестируемый код необходимо соответствующим образом обновить.

private async Task LoginCommandAsync() {

    //.....

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

    //....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...