Nunit 单元测试单触

Nunit 单元测试单触,nunit,xamarin.ios,Nunit,Xamarin.ios,有人成功地为他们的Monotouch项目运行了单元测试吗? 我读过其他文章,其中告诉人们手动添加对适当程序集的引用。 这样做会使项目编译,但它仍然不会运行测试 我有两个项目的解决方案;Monotouch导航项目和NUnit库项目。 我在测试项目中添加了对我的monotouch项目以及monotouch和其他所需组件的引用。 仅在monotouch程序集外运行代码的测试将正常运行,访问monotouch代码的测试失败,原因是: System.IO.IOException:写入失败-->System

有人成功地为他们的Monotouch项目运行了单元测试吗? 我读过其他文章,其中告诉人们手动添加对适当程序集的引用。 这样做会使项目编译,但它仍然不会运行测试

我有两个项目的解决方案;Monotouch导航项目和NUnit库项目。 我在测试项目中添加了对我的monotouch项目以及monotouch和其他所需组件的引用。 仅在monotouch程序集外运行代码的测试将正常运行,访问monotouch代码的测试失败,原因是:

System.IO.IOException:写入失败-->System.Net.Sockets.SocketException:套接字已关闭 在System.Net.Sockets.Socket.Send处(System.Byte[]buf,Int32偏移量,Int32大小,SocketFlags标志)[0x00000]in:0 在System.Net.Sockets.NetworkStream.Write(System.Byte[]缓冲区,Int32偏移量,Int32大小)[0x00000]中:0 ---内部异常堆栈跟踪的结束--- 在System.Net.Sockets.NetworkStream.Write(System.Byte[]缓冲区,Int32偏移量,Int32大小)[0x00000]中:0 位于:0中的System.IO.BufferedStream.Flush()[0x00000]处 at(wrapper remoting invoke with check)System.IO.BufferedStream:Flush() 在System.IO.BufferedStream.Dispose(布尔处理)[0x00000]中:0 在:0中的System.IO.Stream.Close()[0x00000]处 位于:0中的Mono.Remoting.Channels.Unix.ClientConnection.ProcessMessages()[0x00000]

我发现他在说: “。如果您没有在iPhone或iPhone模拟器上运行,则无法调用必要的本机API来实例化组件…”

所以我真正想知道的是,现在是否真的可以在Monotouch中进行单元测试,或者如果不可能,其他人都在做什么


谢谢

你找到的是我的帖子。到目前为止,这是我所能做到的最好的:

  • 将与操作系统无关的代码拉到单独的库中
  • 创建第二个解决方案,使用它自己的项目文件,将这些库编译为vanilla.NET3.5
  • 对库进行单元测试

  • 从好的方面来看,这鼓励了分离您的关注点,并且(理论上)应该更容易将应用程序移植到MonoDroid上。但是保持这两个解决方案的同步是一件痛苦的事情,当它们看不见的时候,很容易偏离实际编写测试的方向。

    您实际上不必创建第二个解决方案,也不必提取与操作系统无关的代码。不过有一些技巧。一般来说:

  • 即使在.Net 3.5/Mono测试项目中,也要参考MonoTouch程序集
  • 主管控制器模式有助于测试代码量
  • 我已经写了一些细节,介绍了我们目前发现的最佳实践。你可以在这里找到它:

    有人成功地为他们的Monotouch项目运行了单元测试吗

    是的,这在最新的MonoTouch 5.1.x(测试版)版本中是可能的

    我发现一篇帖子说:“……如果你没有在iPhone或iPhone模拟器上运行,就没有办法调用必要的本机API来实例化组件……”

    没错。这就是为什么在iOS(模拟器或设备)上执行的a是为了能够执行MonoTouch相关的单元测试而构建的。

    是的,这是可能的


    Xamarin文档团队在上添加了一个文档,该文档使用项目的修改版本进行操作。

    好文章!在那里你会说:“…大多数人在MonoTouch下进行测试的主要问题是,默认情况下,他们会选择“添加…添加新项目…NUnit库项目”,但我看不到你描述了一种首选的方法。我尝试在/Developer中添加对正确程序集的所有引用。。。。。文件夹并使路径成为绝对路径,但运行这些路径仍会导致System.Net.Sockets.SocketException崩溃:套接字已关闭。我还没有开始讨论Supervisor-Controller模式,但这听起来是个好主意!听起来您正在测试的东西仍在从monotouch.dll挂接(或尝试)某些东西。我不推荐添加单元测试项目的另一种方法,因为默认方法可能仍然是最简单的,但需要注意的是,MonoTouch代码的接口必须清晰,所需的引用也必须清晰。更好的解决方案是有一个特定的“MonoTouch单元测试”项目。这还不可用,不过如果您愿意,它是开源的!:)好吧,我误解了您的“修复引用”位,认为它实际上也允许使用monotouch.dll测试代码。我将尝试实现你博客中描述的Supervisor Controller模式。到目前为止,我已经尝试将操作系统代码与其他代码分开,这样我可以让我的大部分代码单元可测试,但是我无法正确测试我的控制器,无法进行端到端测试,这非常令人恼火。我将尝试Phegan的帖子中提到的模式,希望也能得到正确的参考,以便测试我的monotouch代码。