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

时间:2009-04-13 06:00:02

标签: c# silverlight nunit moq

我正在尝试对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倍)

  3. 有没有人知道任何其他SL测试框架或更好的方法来运行针对此框架的测试?

    当我尝试使用TestDriven.Net的vs插件时,我收到一个错误:

    System.IO.FileNotFoundException:无法加载文件或程序集'系统,...

5 个答案:

答案 0 :(得分:9)

感谢Lee提供的信息以及他提供的链接 (http://weblogs.asp.net/nunitaddin/archive/2008/05/01/silverlight-nunit-projects.aspx) 我能够在NUnit中使用代码覆盖率运行我的Silverlight Hudson测试!太棒了!嘿!它们也与ReSharper一起运行,所以我不觉得我在Silverlight中做TDD不再受到惩罚(延迟20秒)。

那么,我到底做了什么?

  • 我为SL3制作了一个Silverlight Unit Test Framework项目:

    http://www.jeff.wilcox.name/2010/05/sl3-utf-bits/

  • 然后我将所有测试项目的Silverlight程序集的引用(除了'mscorlib')更改为'Copy Local: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(...)调用中执行这些测试来解决。

  • 在我的测试中使用unit之后,我无法从SL Test Framework Web界面运行它们,但这对我来说并不是一个问题。如果你确实需要这个工作,那么看看:

    http://www.jeff.wilcox.name/2009/01/nunit-and-silverlight/

  • PS:我还为NUnit控制台运行程序创建了一个NUnit项目,以便从NUnit控制台运行我的测试(不要尝试在同一个NUnit项目中包含非SL测试程序集,它不会工作,因为它使用了不同的nunit.framework库)。

我还尝试过StatLight(http://statlight.codeplex.com/)来从控制台运行测试,这对我很有用,但我是ReSharper和NUnit的粉丝,所以这对我来说不是最好的选择。 StatLight还有一个奇怪的错误,它没有正确加载我的测试项目资源,导致一些测试失败。

我希望这有助于某人。我没有在这里提出任何新内容,而是整合了我希望有人事先为我总结的所有信息。当我得到一些时间时,我将在与SilverLight创建Habanero框架(http://www.habanerolabs.com)项目方面发表博客。

呼。这就是所有人!

答案 1 :(得分:5)

目前答案似乎是Jamie Cansdale的Silverlight Nunit项目模板:

http://weblogs.asp.net/nunitaddin/archive/2008/05/01/silverlight-nunit-projects.aspx

这个模板很精彩,正是我想要的。它也适用于Resharper!我希望这可以节省几个小时的其他人。

答案 2 :(得分:4)

我构建了一个用于持续集成的工具,并加速了一般的Silverlight TDD ......

http://www.StatLight.net

它现在完全支持编译为在Silverlight下运行的任何NUnit版本。

答案 3 :(得分:1)

对我有用的是确保“复制本地”属性(在参考系统的IDE属性网格(F4)中)设置为true。

答案 4 :(得分:0)

听起来像Silverlight 3问题。你能获得Moq.Silverlight和NUnitSilverlight的源代码并在silverlight 3二进制文件上构建它们吗?看起来这些是用SL 2构建的。

相关问题