【问题标题】:Unit testing Monotouch单元测试 Monotouch
【发布时间】:2011-02-03 10:59:55
【问题描述】:

有没有人成功地为他们的 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] in :0 --- 内部异常堆栈跟踪结束 --- 在 System.Net.Sockets.NetworkStream.Write(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小)[0x00000] in :0 在 System.IO.BufferedStream.Flush () [0x00000] in :0 在 (wrapper remoting-invoke-with-check) System.IO.BufferedStream:Flush () 在 System.IO.BufferedStream.Dispose (Boolean disposing) [0x00000] in :0 在 System.IO.Stream.Close () [0x00000] in :0 在 Mono.Remoting.Channels.Unix.ClientConnection.ProcessMessages () [0x00000] in :0

我发现a post 说: “..如果您没有在 iPhone 或 iPhone 模拟器中运行,则无法调用必要的原生 API 来实例化组件..”

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

谢谢!

【问题讨论】:

    标签: nunit xamarin.ios


    【解决方案1】:

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

    1. 引用 MonoTouch 程序集,即使在您的 .Net 3.5/Mono 测试项目中也是如此
    2. Supervisor Controller 模式有助于增加您可以测试的代码量。

    已经写了一些关于我们迄今为止发现的最佳做法的详细信息。你可以在这里找到它:http://ben.phegan.name/index.php/2011/02/28/monotouch-and-unit-testing。

    【讨论】:

    • 好帖子!在那里你说:“..大多数人在 MonoTouch 下测试的主要问题是,默认情况下他们会选择“添加…添加新项目…NUnit 库项目”。”,但我看不到你在描述一种首选的方式。我尝试在 /Developer..... 文件夹中添加对正确程序集的所有引用并使路径成为绝对路径,但运行它们仍然因 System.Net.Sockets.SocketException 崩溃:套接字已关闭。我还没有接触到主管控制器模式,但这听起来是个好主意!
    • 听起来您正在测试的东西仍在从 monotouch.dll 挂钩(或尝试)。我不推荐添加单元测试项目的其他方法,因为默认设置可能仍然是最简单的,但需要注意的是,您需要清理 MonoTouch 代码的接口,并清楚您需要的引用。更好的解决方案是有一个特定的“MonoTouch 单元测试”项目。虽然它是开源的,但如果你热衷的话,这还不可用! :)
    • 好的,我误解了您的“修复引用”位,认为它实际上也允许使用 monotouch.dll 测试代码。将尝试按照您的博客中所述实现主管控制器模式。
    【解决方案2】:

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

    是的,现在可以使用最新的 MonoTouch 5.1.x(测试版)版本。

    我发现一个帖子说:“..如果您没有在 iPhone 或 iPhone 模拟器中运行,则无法调用必要的原生 API 来实例化组件..”

    确实如此。这就是为什么在 iOS(模拟器或设备)上执行 runner 以启用 MonoTouch 相关单元测试的执行。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 到目前为止,我已经尝试将操作系统代码与其他代码分开,以便我可以让我的大部分代码单元可测试,但是很烦人的是我无法正确测试我的控制器并且我不能进行端到端测试。我将尝试 Phegan 的帖子中提到的模式,并希望也能获得正确的参考,以便我测试我的 monotouch 代码。
      【解决方案4】:

      是的,有可能。

      Xamarin 文档团队在 using the built-in unit tests template 上添加了一个文档,该文档使用 NUnitLite 项目的修改版本进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2011-02-05
        • 1970-01-01
        相关资源
        最近更新 更多