单元测试Monotouch

3

有人成功地为他们的Monotouch项目运行单元测试吗? 我读过其他帖子,人们被告知手动添加对应程序集的引用。 这样做可以使项目编译,但仍无法运行测试。

我有一个包含两个项目的解决方案;一个是Monotouch导航项目,另一个是NUnit库项目。 我向我的Monotouch项目和测试项目添加了对Monotouch和其他必要程序集的引用。 只运行Monotouch程序集外部代码的测试会正常运行,访问Monotouch代码的测试失败:

System.IO.IOException: 写入失败 ---> System.Net.Sockets.SocketException: 套接字已关闭 at System.Net.Sockets.Socket.Send (System.Byte[] buf, Int32 offset, Int32 size, SocketFlags flags) [0x00000] in :0 at System.Net.Sockets.NetworkStream.Write (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in :0 --- 内部异常堆栈跟踪结束 --- at System.Net.Sockets.NetworkStream.Write (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in :0 at System.IO.BufferedStream.Flush () [0x00000] in :0 at (wrapper remoting-invoke-with-check) System.IO.BufferedStream:Flush () at System.IO.BufferedStream.Dispose (Boolean disposing) [0x00000] in :0 at System.IO.Stream.Close () [0x00000] in :0 at Mono.Remoting.Channels.Unix.ClientConnection.ProcessMessages () [0x00000] in :0
我发现一篇帖子说: "..如果你不在iPhone上运行或在iPhone模拟器中运行,则没有办法调用必要的本地API来实例化组件.."
所以我真正想知道的是,目前在Monotouch中是否真的可以进行单元测试,如果不能,那么其他人都做什么呢?
谢谢!
4个回答

2
有人成功地为他们的Monotouch项目运行单元测试了吗?
是的,最新的MonoTouch 5.1.x(beta)版本现在可以实现这一点。
我发现一篇文章说:“..如果你不在iPhone上运行或在iPhone模拟器中运行,就没有办法调用必要的本地API来实例化组件..”
这是真的。这就是为什么一个在iOS(模拟器或设备)上执行的runner被构建出来,以启用与MonoTouch相关的单元测试的执行。

2
您实际上不需要创建第二个解决方案或提取OS-不可知代码。但有一些技巧:
一般而言:
  1. 引用MonoTouch程序集,即使在您的.NET 3.5/Mono测试项目中也是如此
  2. 用监管者控制器模式可以帮助您测试的代码量。
我们已经撰写了一些详细信息,介绍到目前为止我们发现的最佳实践方法。您可以在这里找到它:http://ben.phegan.name/index.php/2011/02/28/monotouch-and-unit-testing

好帖子!你说:“..大多数人在使用MonoTouch进行测试时遇到的主要问题是,默认情况下他们会选择“添加...添加新项目...NUnit库项目”。”,但我没有看到你描述一种首选的方法。我尝试将所有引用添加到/Developer.....文件夹中的正确程序集,并使路径绝对,但运行它们仍然崩溃并显示System.Net.Sockets.SocketException:套接字已关闭。我还没有开始使用Supervisor Controller模式,但听起来是个好主意! - TenaciousG
听起来像是你正在测试的东西仍然在从monotouch.dll中挂钩某些东西(或尝试)。我没有建议另一种添加单元测试项目的方法,因为默认方式可能仍然是最简单的,但需要注意清楚你的接口对于MonoTouch代码和你所需的引用。更好的解决方案是拥有一个特定的“MonoTouch单元测试”项目。虽然这还不可用,但如果你有兴趣,它是开源的! :) - Ben Phegan
好的,我误解了你所说的“修复引用”部分,认为它实际上也允许使用monotouch.dll测试代码。我会尝试按照你博客中描述的Supervisor Controller模式进行实现。 - TenaciousG

0

这是我发布的帖子。到目前为止,这是我能做到的最好的:

  1. 将与操作系统无关的代码提取到单独的库中。
  2. 创建第二个解决方案,具有自己的项目文件,以编译那些作为普通 .NET 3.5 的库。
  3. 对库进行单元测试。

好的一面是,这鼓励分离你的关注点,并且(理论上)应该更容易将应用程序移植到 MonoDroid 等平台。但是,保持两个解决方案同步很麻烦,当它们不在视线范围内时,很容易偏离实际编写测试的目标。


到目前为止,我已经尝试将操作系统代码与其余代码分离,以便我可以使大部分代码可单元测试,但是很烦人的是我无法正确地测试我的控制器并且我无法进行端到端测试。我将尝试Phegan帖子中提到的模式,并希望也能正确获取参考资料,以便我可以测试我的Monotouch代码。 - TenaciousG

0

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