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);
//....
}