WPF单元测试方法总结
WPF单元测试的创建需要有一定编程经验的开发人员,才能熟练的操作。那么,在这篇文章中我们将针对WPF单元测试的创建过程做一个简单的介绍。
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”。
下面是错误的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单元测试代码:
相关推荐
蛰脚踝的天蝎 2020-11-10
Cocolada 2020-11-12
TuxedoLinux 2020-09-11
snowphy 2020-08-19
83540690 2020-08-16
lustdevil 2020-08-03
83417807 2020-07-19
张文倩数据库学生 2020-07-19
bobljm 2020-07-07
83417807 2020-06-28
86427019 2020-06-28
86427019 2020-06-25
zhengzf0 2020-06-21
tobecrazy 2020-06-16
宿命java 2020-06-15
83417807 2020-06-15
84284855 2020-06-11