在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,记录Log, 文件系统 之类的)。 而我们没法控制这些外部依赖的对象。 为了解决这个问题,我们需要用到Stub和Mock来模拟这些外部依赖的对象,从而控制它们
阅读目录
实例
设计测试用例
什么是外部依赖
Stub和Mock的相同处
Stub和Mock的区别
良好的产品代码才能单元测试
Mock框架
源代码下载
实例
Analyze类会检查filename的长度,如果小于8,我们就会使用一个实现IWebService的类来记录错误.
我们需要给Analyze方法写单元测试。
public class LogAnalyzer { private IWebService service; private IEmailService email; public IWebService Service { get { return service; } set { service = value; } } public IEmailService Email { get { return email; } set { email = value; } } public void Analyze(string fileName) { if (fileName.Length < 8) { try { service.LogError("the file name is to short" + fileName); } catch (Exception e) { email.SendEmail("From@test.com", "To@test.com", "IWebServiceFailed", e.Message); } } } } |
设计测试用例
测试用例一:
fileName= “c:\test\test.txt” (长度大于8),
期待测试结果: 不会发邮件
测试用例二:
fileName=”c:\”,(长度小于8), 并且记log失败 。
期待测试结果: 发邮件
如果给Analyze方法写单元测试,为了实现测试用例二。 这时候我们就会碰到两个问题。
第一: 我们无法控制让Service对象记log时抛出异常. 因为Serveice对象我们无法控制
第二: 我们无法判断,Email对象是否发送了Email, (我们不能去Outlook查看收到邮件没有,这样就不是自动化了)