在 monotouch/monodroid 中使用 mocks 进行单元测试
Posted
技术标签:
【中文标题】在 monotouch/monodroid 中使用 mocks 进行单元测试【英文标题】:unit tests with mocks in monotouch/monodroid 【发布时间】:2013-03-16 07:57:51 【问题描述】:我目前正在 MonoTouch/MonoDroid 上开发一个应用程序,我想改进我的测试(在带有 xamarin 工作室的 Mac 上工作)。我知道如何编写在模拟器上运行的集成测试(至少在带有 ios 单元测试项目的 iOS 上)。
我现在想做的是 TTD,使用小型的、仅模拟的测试来测试一个指定的类(并且不在任何设备/模拟器中运行 - 仅用于单元测试)。我曾经使用 Mockito 在 Java 上执行此操作,并尝试使用 Moq 4.0 在我的单声道解决方案上执行相同操作。
为此,我不需要 Mono 的任何东西,只需要简单的类。所以我尝试创建一个新的 N 单元项目并将我的类链接到该项目中。但是现在,要编译代码,我需要包含我在该类中使用的所有引用(例如 Xamarin.Mobile.Geolocator、RestSharp、Geo 等),即使我以后模拟它们也是如此。当我这样做时,代码会编译,但是当我运行第一个测试时,会出现错误,提示 System.Core 的 x.y 版本不可用。这个问题是有道理的,这些库使用特定的、单一版本的系统库,而该版本在该测试项目中不可用。
我看到的唯一解决方案是避免这些引用,并为我在代码中使用的所有库类编写空存根,只是为了让它编译。但这是很多无用的工作,我真的尽量避免。
所以长话短说:有人可以帮助我在 xamarin mono 中进行测试优先开发的工作设置吗?我可以在哪里使用 Moq 这样的模拟框架并且不需要在模拟器上运行我的单元测试?重要的是还有一些模拟第三方库的解决方案(并使代码在我的测试项目中编译)。
【问题讨论】:
Mocking framework for use with xamarin android的可能重复 【参考方案1】:我还没有使用 Xamarin 2 中的新工具 - 我的许可证已过期,所以我仍在 VS 中使用旧的 Mono for Android。
测试优先的方法在平台上无疑是一个挑战。
如果您准备准备将移动特定库与间接分开,那么最好的做法是创建一个针对 .NET 框架的普通类库项目,添加您要测试的文件和选择添加为链接选项。
当然,您需要将域逻辑与平台特定逻辑很好地分离才能正常工作,但您可以使用各种测试/模拟框架的全部功能。
另一种选择是将跨平台元素分离到可移植类库 (PCL) 中并以相同的方式进行测试。 PCL 路线有一些优点和缺点 - this 答案中的更多信息。
【讨论】:
+1 用于走 PCL 路线,并将您的代码与隐藏在接口后面的实现分开。以上是关于在 monotouch/monodroid 中使用 mocks 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?
可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用
如何在 Python 中使用 kivy 在 TabeedPanel 中使用 GridLayout
如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值