代码改变世界

VS2008单元测试之NMock2

2010-02-26 13:56  杨延成  阅读(1921)  评论(2编辑  收藏  举报

在做单元测试时,有时候需要其它的类的支持,但是其它的类很可能没有写好,或者根本就不存在,为了继续进行测试,我们不得不构造一个虚拟的类来帮助,NMock就是这样一个工具。
NMock2是NMock的针对FrameWork2.0的版本,免费的,网上教程非常少见,这里给大家提供一个简单示例。
首先去官网下载最新版本。下载后解压缩就可以了,他提供的是DLL文件,不用安装。
然后,再要使用的工程中引用这个DLL,即NMock2.dll。
还是继续用我前两篇文章用的工程,首先在被测工程NunitTest中,添加一个类Student.cs,代码如下:

代码
1 public class Student
2 {
3 public Student(int stuID, string stuName)
4 {
5 this.stuID = stuID;
6 this.stuName = stuName;
7 }
8
9 private int stuID;
10
11 public int StuID
12 {
13 get { return stuID; }
14 set { stuID = value; }
15 }
16
17 private string stuName;
18
19 public string StuName
20 {
21 get { return stuName; }
22 set { stuName = value; }
23 }
24
25 public override bool Equals(object obj)
26 {
27 Student s = obj as Student;
28 if (s == null)
29 return false;
30 bool isSame = s.StuID.Equals(this.stuID) && s.StuName.Equals(this.stuName);
31
32 return isSame;
33 }
34
35 }


在添加一个接口IStudentDAL.cs,代码如下:

1 public interface IStudentDAL
2 {
3 Student GetStuddent(int stuID);
4 }

在添加一个StudentService.cs类,具体代码如下:

代码
1 public class StudentService
2 {
3 private IStudentDAL studentDAL;
4 public StudentService(IStudentDAL studentDAL)
5 {
6 this.studentDAL = studentDAL;
7 }
8
9 public Student GetStuddent(int stuID)
10 {
11 return studentDAL.GetStuddent(stuID);
12 }
13
14 }

这些建好后,我们希望测试一下,但还没有IStudentDAL的实现类,那么可以虚拟一个出来,具体操作如下:
在测试工程NunitDemo中添加NMock2.dll的引用,然后添加一个类NMockDemo.cs,具体代码如下:

代码
1 [TestFixture]
2 public class NMockDemo
3 {
4 private Mockery mock;
5
6 [SetUp]
7 public void BeforeTest()
8 {
9 mock = new Mockery();
10 }
11
12 [Test]
13 public void TestGetStudent()
14 {
15
16 Student s1 = new Student(1, "abc");
17
18 //虚拟IStudentDAL对象
19 var studentDAL = mock.NewMock<IStudentDAL>();
20 StudentService s = new StudentService(studentDAL);
21
22 //调用studentDAL.GetStuddent(1)时 return new Student(1,"abc")
23 Expect.Once.On(studentDAL).Method("GetStuddent").With(1).Will(Return.Value(new Student(1,"abc")));
24
25 Student stu = s.GetStuddent(1);
26 Assert.AreEqual("abc", stu.StuName);
27 Assert.AreEqual(s1, stu);
28 //Assert.AreNotEqual(s1, stu);
29
30
31 }
32
33 }

这些都写好后,就可以用NUnit进行测试了。