如何在Xamarin.Forms的DependencyService中使用MOQ

5

我正在编写一个 Xamarin.Forms 项目,现在正尝试进行 单元测试,我目前使用的是 Xamarin.Forms DependencyService,如下所示:

PCL 接口

public interface IGetDatabase
{
   string GetDataBase()
}

设备特定的实现

[assembly: Dependency(typeof(MyProject.Droid.GetDatabaseImplementation))]
class GetDatabaseImplementation: IGetDatabase
{
   public string GetDatabase()
   {
       return "MyDatabasePath";
   }
}

而在PCL中,它被称为:

DependencyService.Get<IGetDatabase>().GetDatabase();

现在我想使用MOQ对我的接口实现进行单元测试,以便在运行时生成我的实现。 我不想编写模拟类,因为我的实际示例更加复杂,这意味着它不起作用。
如何做到这一点? 我的DepdencyService是否与Xamarin耦合过紧?

相关链接:https://dev59.com/-XM_5IYBdhLWcg3wPAfT#1465896 - Mark Seemann
1个回答

3
很遗憾,您只能在当前应用程序中注册实现接口的类。 您需要一种依赖注入框架,该框架允许您注册a)对象实例或b)创建并返回新模拟对象的方法作为接口的实现。 有很多不同的C#依赖注入容器可供选择。 我使用随附MvvmCross的Mvx。 它允许您注册使用Moq创建的模拟对象。 示例
var myMoq = new Moq<IGetDatabase>();
Moq.Setup(x => x.GetDatabase()).Returns(() => "MyMockDatabasePath");
Mvx.RegisterSingleton<IGetDatabase>(() => myMoq.Object);

1
谢谢。这就是我认为我必须做的,只是想知道是否有一种使用Xamarin.Forms DependencyService的方法来实现它,但看起来没有,我将不得不重构。我会用一些示例代码更新这个答案。 - JKennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接