WPF单元测试方法总结

WPF单元测试的创建需要有一定编程经验的开发人员,才能熟练的操作。那么,在这篇文章中我们将针对WPF单元测试的创建过程做一个简单的介绍。 

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

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

  1. [TestFixture]   
  2. public class ClassTest {   
  3. [Test] public void TestRun() {   
  4. ClassLibrary1.Class1 obj = 
    new ClassLibrary1.Class1();  
  5. double expected = 9;   
  6. double result = obj.GetSomeValue(3);   
  7. Assert.AreEqual(expected, result);   
  8. }   

2,对WPF UI组件进行测试

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

下面是错误的WPF单元测试代码:

[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);   


}   


} 

为了让调用线程为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(Security
Action.Demand)]   


private static void ThrowException
PreservingStack(Exception exception) {   



FieldInfo remoteStackTraceString = 
typeof(Exception).GetField( "_remoteStack
TraceString", BindingFlags.Instance | 
BindingFlags.NonPublic);  



remoteStackTraceString.SetValue(exception,
 exception.StackTrace + Environment.NewLine);   


throw exception;   


}   


}   


} 

并编写正确的WPF单元测试代码:

相关推荐