我们在开发,有时遇到一些Legcy代码,然后需要对它们进行UnitTest。UnitTest的重要性在这里不再说了。但是发现某些Class中有些方法是Static的,按以往的方法我们需要用
Extact Interface 方法 从那个需要测试的Class,然后使用 IOC /DI 的方式替换具体的实现,用一个Fake Class或Mock 一个实现来完成 UnitTest。现在我们可以使用Moles 对静态方法做UnitTest。看下面的示例:
假设有这个样的Class:
1: public class SomeClass
2: {
3: private int AddTenItem(int num)
4: {
5: return num + 10;
6: }
7:
8: private static int AddTwentyItem(int num)
9: {
10: return num + 20;
11: }
12:
13: public static string GetMessage(string msg)
14: {
15: return string.Format("--{0}--", msg);
16: }
17:
18: public string GetTotalItem(int num)
19: {
20: return string.Format("{0}", AddTenItem(num) + AddTwentyItem(num)) ;
21: }
22: }
从上面方法我们看到一个GetMessage静态方法,下面看用UnitTest如何测试它。你需要先下载安装Moles从官方网站,然后在VS2010中通过Project的 Reference右键菜单 在需要Mock Assembly,选择”Add Moles Assembly” ,它会自动生成一个 “SomeNameAssembly.Moles”程序集。编写下面的单元测试Code:
1: [TestMethod]
2: [HostType("Moles")]
3: public void TestGetMessageWithMoles()
4: {
5: //arrange
6: MSomeClass.GetMessageString = (str) => str + "--";
7:
8: //act
9: var result = SomeClass.GetMessage("test");
10:
11: //assert
12: Assert.AreEqual("test--", result);
13: }
需要增加一个Attribtue [HostType(“Moles”)] 对于MsTest,MSomeClass是Moles生成的并自动引用于Project上了,如上面代码你可以看到我们可以Mock 这个方法的实现了。 对于private的方法也可以,看下面的代码:
1: [TestMethod]
2: [HostType("Moles")]
3: public void TestPrivateMethodWithMoles()
4: {
5: //arrange
6: MSomeClass.AddTwentyItemInt32 = (i) => i + 2;
7: MSomeClass.AllInstances.AddTenItemInt32 = (SomeClass, i) => i + 1;
8:
9: //act
10: string result = new SomeClass().GetTotalItem(1);
11:
12: //assert
13: Assert.AreEqual("5", result);
14: }
就这么简单,上面的代码我们指定两个Private方法delegate,一个是Static method,另一个是Instance method,这里标记是AllInstances。 然后Call那个Public的方法,最后Assert。它们无缝地你的真正方法整合在一起做UnitTest。
希望对您的开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。