使用Moq、Silverlight和NUnit进行单元测试

11

我正在尝试对一个Silverlight 3项目进行单元测试。我正在使用:

当我编写不使用Moq的测试时,它按预期工作。

当我在测试之外使用Moq时,Moq像应有的那样工作。(我模拟了一个接口并在按钮处理程序中进行验证以作为证明。)

但当我运行使用Moq的单元测试时,总是得到以下结果:

System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system cannot find the file specified.
at Moq.ExpressionExtensions.ToStringFixVisitor..ctor(Expression expression)
at Moq.Interceptor.AddCall(IProxyCall call, SetupKind kind) in c:\Build\Moq Drop\moq\WorkingDirectory\trunk\Source\Interceptor.cs: line 104
at Moq.Mock.<>c__DisplayClassc`2.<Setup>b__b() in c:\Build\Moq Drop\moq\WorkingDirectory\trunk\Source\Mock.cs: line 387
at Moq.PexProtector.Invoke<T>(Func`1 function) in c:\Build\Moq Drop\moq\WorkingDirectory\trunk\Source\PexProtector.cs: line 17
at Moq.Mock.Setup<T1,TResult>(Mock mock, Expression`1 expression) in c:\Build\Moq Drop\moq\WorkingDirectory\trunk\Source\Mock.cs: line 371
at Moq.Mock`1.Setup<TResult>(Expression`1 expression) in c:\Build\Moq Drop\moq\WorkingDirectory\trunk\Source\Mock.Generic.cs: line 194
at SilverlightMoq.Test1.TestFirst() in Test1.cs: line 23 

如何解决这个问题?


我使用相同的方式重新构建了 SL 3 的两个程序集,但结果相同。

我能够在 Microsoft Silverlight 单元测试框架上运行测试。

http://code.msdn.microsoft.com/silverlightut/

这是一种基于浏览器的测试框架,似乎是单元测试 SL 的标准方式。但存在以下问题:

  1. 您必须一次运行所有测试

  2. 速度非常慢。

    (与在 nunit 测试框架中运行的相同测试相比,速度慢大约5倍)

是否有人知道其他的 SL 测试框架或更好的方法来针对该框架运行测试?

当我尝试使用 TestDriven.Net 的 VS 插件时,会出现以下错误:

System.IO.FileNotFoundException: Could not load file or assembly 'System,...

5个回答

9
感谢Lee提供的信息和他提供的链接(http://weblogs.asp.net/nunitaddin/archive/2008/05/01/silverlight-nunit-projects.aspx),我成功地在Hudson中运行了我的Silverlight NUnit测试,并获得了代码覆盖率!这真是太棒了!它们还可以与ReSharper一起运行,所以我再也不会因为在Silverlight中进行TDD而感到惩罚了(有20秒的延迟)。

那么,我具体做了什么呢?

我为SL3创建了一个Silverlight Unit Test Framework项目: (http://www.jeff.wilcox.name/2010/05/sl3-utf-bits/)。然后,我按照以下详细说明更改了所有测试项目的Silverlight程序集引用(除'mscorlib'之外)为“复制本地:True”:(http://weblogs.asp.net/nunitaddin/archive/2008/05/01/silverlight-nunit-projects.aspx)。接下来,我添加了对提供在以下博客中的Silverlight NUnit 2.5.1框架的引用(在我下面提到的Jeff Willcox和Jamie Cansdale的博客中提供了其他版本,但这是我找到的最新版本):(http://wesmcclure.tumblr.com/post/152727000)。就这样!在此之后,我可以编写我的测试,在ReSharper中运行它们,并从NUnit测试运行器中运行它们!此外,我还可以使用ncover获得覆盖率报告!!!编辑:哦,是的,如果您运行任何需要UI线程的测试,则会在ReSharper中出现交叉线程错误。通过在Deployment.Current.Dispatcher.BeginInvoke(...)调用中执行这些测试来解决这个问题。在使用单元测试后,我无法从SL测试框架Web界面运行它们,但这对我来说并不是太大的问题。如果您确实需要使其正常工作,请查看:(http://www.jeff.wilcox.name/2009/01/nunit-and-silverlight/)。PS:我还为NUnit控制台运行器创建了一个NUnit项目,以从NUnit控制台运行我的测试(不要尝试将非SL测试程序集包含在同一个NUnit项目中,因为它使用不同的nunit.framework库)。
我还尝试了 StatLight (http://statlight.codeplex.com/) 从控制台运行测试,这对我很有效,但我是 ReSharper 和 NUnit 的粉丝,所以那不是最好的选择。StatLight 还存在一个奇怪的 bug,它无法正确加载我的测试项目资源,导致一些测试失败。

我希望这能帮助到某些人。我没有提出任何新东西,而只是整合了所有我希望有人事先总结给我的信息。当我有时间时,我会在创建一个 Habanero 框架 (http://www.habanerolabs.com) 项目与 SilverLight 方面进行博客。

哇。就这些!


@MarkWhitfeld 有没有办法在本地的测试资源管理器窗口中显示结果? - Jay Wick
不确定@jay,我在过去的4年里没有做过Silverlight项目。自那时以来可能发生了很多变化。 - Mark Whitfeld

5

4
我为持续集成和加速Silverlight TDD而构建了一个工具......现在,它完全支持任何编译为Silverlight运行的NUnit版本。请查看http://www.StatLight.net

1
我的解决方法是确保在IDE属性网格(F4)中,引用System的“Copy Local”属性设置为true。

0

听起来像是Silverlight 3的问题。你能否获取Moq.Silverlight和NUnitSilverlight的源代码,并在Silverlight 3二进制文件上构建它们?似乎它们是使用SL 2构建的。


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