C# 模仿Azure MobileServiceClient

C# 模仿Azure MobileServiceClient,c#,unit-testing,moq,azure-mobile-services,C#,Unit Testing,Moq,Azure Mobile Services,我有一个需要进行单元测试的方法,我一直在对其中的一部分进行模拟 private async void LoginCommandAsync() { ..... CancellationToken ct; var result = await ClientAuthorizationService.CurrentClient.InvokeApiAsync(Constants.ApiConstants.AzureAuthMeData,

我有一个需要进行单元测试的方法,我一直在对其中的一部分进行模拟

private async void LoginCommandAsync()
    {

        .....

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

        ....
    }
我尝试使用Moq模拟Microsoft.WindowsAzure.MobileServices.MobileServiceClient。不幸的是,我总是在最后一行代码中得到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;

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

//.....

您正在模拟
IMobileServiceClient
,该接口决不会是
mobileseserviceclient
类。这感觉像是一场灾难。你到底想做什么?什么是
ClientAuthorizationService
ClientAuthorizationService.CurrentClient
?我试图模拟MobileServiceClient,因为在我需要进行单元测试的方法中发生了InvokeApiAsync。当前,类型为MobileServiceClient的CurrentClient是ClientAuthorizationService的成员/属性,它是IClientAuthorizationService的自己实现,没有其他依赖项。带有的问题正确地表示要解决的问题,因此我们可以更好地帮助您。根据建议,我编辑了我的原始问题。如果您需要更多信息,请告诉我常量来自何处?@Gerry最初的问题已经解决了。在调用API时,很可能有一些带有常量字符串的静态类<代码>公共静态类常量{public class ApiConstants{public const string ApplicationUrl=“此处的某些URL”}}
//....

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

//.....
private async Task LoginCommandAsync() {

    //.....

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

    //....
}