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