gpt4 book ai didi

unit-testing - 我可以在 Visual Studio 单元测试(类库)项目中使用 Xamarin.Forms.DependencyService 吗?

转载 作者:行者123 更新时间:2023-12-04 02:23:00 24 4
gpt4 key购买 nike

我正在使用 Xamarin Forms 构建一个移动应用程序,并通过 Xamarin Forms Labs 插件利用 MVVM。我的解决方案设置如下:

  • iOS 项目
  • UI 可移植类库项目(仅限 Views/Xaml)
  • 核心可移植类库项目(ViewsModels/Models/其他)
  • 测试类库项目

我已成功添加了对 Xamarin Forms 和 Xamarin Forms Labs 的引用的测试项目,并且可以运行实例化 ViewModel 的测试。然而,当我使用 Xamarin Forms Dependency Service 实现跨平台功能时,我认为我也可以在测试库中使用它来为那些特定于平台的调用注入(inject)虚拟实现。这样我就可以更全面地测试 View 模型和其他所有内容。

但是在下面的代码中:

    [TestMethod()]
public void TestingDependencyInjection()
{
string strInfo = Xamarin.Forms.DependencyService.Get<Interfaces.ITestingInterface>().GetInformation();
Assert.IsFalse(string.IsNullOrEmpty(strInfo));
}

从 Xamarin.Forms.Core.dll 中抛出一个 InvalidOperationException,其中包含以下信息:“您必须调用 Xamarin.Forms.Init();在使用它之前。”

但是在测试项目中“Init”并不是Forms的成员!

我想我可以在 Xamarin Forms 中已有的注入(inject)服务之上使用一些其他注入(inject)服务,但我不希望那样做。

还有其他人试过这样做吗?

最佳答案

您必须将实现 IPlatformServices 的类分配给 Device.PlatformServices 静态属性。现在,这很棘手,因为 IPlatformServices 接口(interface)和 Device.PlatformServices 都是内部的。但这是可行的。

将您的单元测试程序集命名为“Xamarin.Forms.Core.UnitTests”,因为内部结构对于这样命名的程序集(以及其他几个名称)是可见的。

实现伪造的 PlatformServices,即:

public class PlatformServicesMock: IPlatformServices
{
void IPlatformServices.BeginInvokeOnMainThread(Action action)
{
throw new NotImplementedException();
}
ITimer IPlatformServices.CreateTimer(Action<object> callback)
{
throw new NotImplementedException();
}
ITimer IPlatformServices.CreateTimer(Action<object> callback, object state, int dueTime, int period)
{
throw new NotImplementedException();
}
ITimer IPlatformServices.CreateTimer(Action<object> callback, object state, long dueTime, long period)
{
throw new NotImplementedException();
}
ITimer IPlatformServices.CreateTimer(Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)
{
throw new NotImplementedException();
}
ITimer IPlatformServices.CreateTimer(Action<object> callback, object state, uint dueTime, uint period)
{
throw new NotImplementedException();
}
Assembly[] IPlatformServices.GetAssemblies()
{
return new Assembly[0];
}
Task<Stream> IPlatformServices.GetStreamAsync(Uri uri, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
IIsolatedStorageFile IPlatformServices.GetUserStoreForApplication()
{
throw new NotImplementedException();
}
void IPlatformServices.OpenUriAction(Uri uri)
{
throw new NotImplementedException();
}
void IPlatformServices.StartTimer(TimeSpan interval, Func<bool> callback)
{
throw new NotImplementedException();
}

bool IPlatformServices.IsInvokeRequired
{
get
{
throw new NotImplementedException();
}
}
}

请注意,我没有在 GetAssembly block 中返回任何程序集(对程序集进行分析以查找实现接口(interface)的类型)。随时返回您需要的程序集数组。

将 PlatformServicesMock 实例分配给 Device.PlatformServices:

var platformServicesProperty = typeof(Device).GetProperty("PlatformServices", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
platformServicesProperty.SetValue(null, new PlatformServicesMock());

这是一个肮脏的解决方案,但它应该仍然有效。另请注意,Visual Studio 可能会绘制很多指示错误的波浪线(内部不可见),但可以正常编译。

HTH

关于unit-testing - 我可以在 Visual Studio 单元测试(类库)项目中使用 Xamarin.Forms.DependencyService 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com