Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|产品中心下载UML生成C++
您现在的位置: 天极网 > 开发频道 > 经典解析:为 WPF 项目创建单元测试
全文
群乐:.NET

经典解析:为 WPF 项目创建单元测试

2007-10-18 10:16 作者: 周银辉 出处: 博客园 责任编辑:幽灵

  可能你已发现一个问题,我们无法使用VSWPF项目创建单元测试(VS2005不行,VS2008我没试过,但据说也不行),这让人很郁闷,这里将介绍如何使用NUnit来对WPF项目创建单元测试并解决其中的难题(但利用NUnit来对WPF创建单元测试时并不会像针对.Net2.0一样容易,可能会出现一些小问题)。

  1,对普通类(非WPF UI组件)进行测试:

  这和在.Net2.0中使用NUnit进行测试时一样,不会出现任何问题,参考下面的代码:

以下是引用片段:
   [TestFixture]
   public class ClassTest
   {
   [Test]
   public void TestRun()
   {
   ClassLibrary1.Class1 obj = new ClassLibrary1.Class1();
  
   double expected = 9;
   double result = obj.GetSomeValue(3);
  
   Assert.AreEqual(expected, result);
   }
   }
  

  2,对WPF UI组件进行测试

  使用NUnit对WPF UI组件(比如MyWindow,MyUserControl)进行测试的时候,NUnit会报如下异常:“The calling thread must be STA, because many UI components require this”。

  下面是错误的测试代码:

以下是引用片段:
  [TestFixture]
   public class ClassTest
   {
   [Test]
   public void TestRun()
   {
   WindowsApplication1.Window1 obj = new WindowsApplication1.Window1();
  
   double expected = 9;
   double result = obj.GetSomeValue(3);
  
   Assert.AreEqual(expected, result);
   }
   }

wpfUnitTestError1

  为了让调用线程为STA,我们可以编写一个辅助类CrossThreadTestRunner:

以下是引用片段:
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Threading;
  using System.Security.Permissions;
  using System.Reflection;
  
  namespace TestUnit
  {
   public class CrossThreadTestRunner
   {
   private Exception lastException;
  
   public void RunInMTA(ThreadStart userDelegate)
   {
   Run(userDelegate, ApartmentState.MTA);
   }
  
   public void RunInSTA(ThreadStart userDelegate)
   {
   Run(userDelegate, ApartmentState.STA);
   }
  
   private void Run(ThreadStart userDelegate, ApartmentState apartmentState)
   {
   lastException = null;
  
   Thread thread = new Thread(
   delegate()
   {
   try
   {
   userDelegate.Invoke();
   }
   catch (Exception e)
   {
   lastException = e;
   }
   });
   thread.SetApartmentState(apartmentState);
  
   thread.Start();
   thread.Join();
  
   if (ExceptionWasThrown())
   ThrowExceptionPreservingStack(lastException);
   }
  
   private bool ExceptionWasThrown()
   {
   return lastException != null;
   }
  
   [ReflectionPermission(SecurityAction.Demand)]
   private static void ThrowExceptionPreservingStack(Exception exception)
   {
   FieldInfo remoteStackTraceString = typeof(Exception).GetField(
   "_remoteStackTraceString",
   BindingFlags.Instance | BindingFlags.NonPublic);
   remoteStackTraceString.SetValue(exception, exception.StackTrace + Environment.NewLine);
   throw exception;
   }
   }
  }
共2页。 1 2 :
网友关注
最新上市
编辑推荐
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml