如何测试包含Application.Current.Properties.ContainsKey(“token”)的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试包含Application.Current.Properties.ContainsKey(“token”)的方法相关的知识,希望对你有一定的参考价值。

我正在尝试测试我的Xamarin应用程序的登录,但为了使应用程序正常工作,我必须创建一个令牌。方法如下:

public string RetrieveToken()
{
    if (Application.Current.Properties.ContainsKey("token"))
    {
         return Application.Current.Properties["token"] as string;
    }
    return null;
}

但是当测试运行时我收到NullReferenceError,因为Application.Current.Properties.ContainsKey("token")不能在测试中使用。所以我的问题是,是否有办法逃避这一点。

答案

你在这个项目中使用任何依赖注入吗?当我们为ViewModel编写单元测试时,我使用Application.Current.Resources做了类似的事情。

您可以将Application.Current.Properties注册为服务上的财产。然后使用您的项目服务并在测试中模拟属性。

例如,如果您使用的是Microsoft Unity DI,则可以执行以下操作:

public interface IAppPropertyService
{
    IDictionary<string, object> Properties { get; set; }
}

public class AppPropertyService : IAppPropertyService
{
    public const string AppPropertiesName = "AppProperties";

    public IDictionary<string, object> Properties { get; set; }

    public AppPropertyService([IocDepndancy(AppPropertiesName)] IDictionary<string, object> appProperties)
    {
        Properties = appProperties;
    }
}

然后在你的应用程序中注册这样的服务:

Container.RegisterInstance<IDictionary<string, object>>(AppPropertyService.AppPropertiesName, Application.Current.Properties);
Container.RegisterType<IAppPropertyService, AppPropertyService>();

在你的测试中使用模拟版本的Application.Current.Properties,例如只是一个字典:

Container.RegisterInstance<IDictionary<string, object>>(AppPropertyService.AppPropertiesName, new Dictionary<string, object>());
Container.RegisterType<IAppPropertyService, AppPropertyService>();

只需确保在项目中使用PropertyService而不是Application.Current.Properties,如下所示:

public string RetrieveToken()
{
    var propertyService = Container.Resolve<IAppPropertyService>();

    if (propertyService.Properties.ContainsKey("token"))
    {
         return propertyService.Properties["token"] as string;
    }
    return null;
}

以上是关于如何测试包含Application.Current.Properties.ContainsKey(“token”)的方法的主要内容,如果未能解决你的问题,请参考以下文章

Application.Current.Dispatcher.BeginInvoke(action) VS。 Application.Current.Dispatcher.Invoke(action)

WPF中Application.Current的使用

Application.Current 和 App.Current 为空

UWP 应用程序错误:“无效的绑定路径‘Application.Current’:在类型‘MainPage’上找不到属性‘Application’”

在 WPF / Regex 中读取 Application.Current.Properties 的整数

Application.Current.<PageName> 返回 null