桩破除依赖1-重构代码和参数注入

前端之家收集整理的这篇文章主要介绍了桩破除依赖1-重构代码和参数注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

抽取接口使底层实现可替换

代码地址:http://git.oschina.net/zhv/UnitTest

首先将第一章的代码重构,抽取出实现代码,放到FileExtensionManager类中。

  1. public class LogAnalyzer
  2. {
  3. public bool WasLastFileNameValid { get; set; }
  4.  
  5. public bool IsValidLogFileName(string fileName)
  6. {
  7. //使用抽取出来的类
  8. FileExtensionManager mgr =
  9. new FileExtensionManager();
  10. return mgr.IsValid(fileName);
  11. }
  12. }
  13. //首先定义出这个抽取的类
  14. class FileExtensionManager
  15. {
  16. public bool IsValid(string fileName)
  17. {
  18. //读取文件
  19. }
  20. }

然后定义ExtensionManager的接口IExtensionManager并实现

  1. class FileExtensionManager:IExtensionManager
  2. {
  3. public bool IsValid(string fileName)
  4. {
  5. //读取文件
  6. }
  7. }
  8. //然后定义新接口
  9. public interface IExtensionManager
  10. {
  11. bool IsValid(string fileName);
  12. }
  13.  
  14. public bool IsValidLogFileName(string fileName)
  15. {
  16. //定义这个接口的类型变量
  17. IExtensionManager mgr =
  18. new FileExtensionManager();
  19.  
  20. return mgr.IsValid(fileName);
  21. }

现在就创建了一个提供IsValid(string)方法的接口IExtensionManager,用FileExtensionManager实现这个接口。代码功能没有变,但是现在可以用自己的伪造的扩展名管理器来代替真实 扩展名管理器了

  1. //这个是总是返回true的简单桩代码
  2. //使用Fake说明这个类的对象类似另一个对象,既可能用作模拟对象,也可能用作桩
  3. public class AlwaysValidFakeExtensionManager: IExtensionManager
  4. {
  5. //实现IExtensionManager接口
  6. public bool IsValid(string fileName)
  7. {
  8. return true;
  9. }
  10. }

现在虽然有了一个接口和两个实现此接口的类,但是被测试的方法还是对具体类进行直接调用

  1. public bool IsValidLogFileName(string fileName)
  2. {
  3. IExtensionManager mgr =
  4. new FileExtensionManager();
  5.  
  6. return mgr.IsValid(fileName);
  7. }

所以必须想办法让被测试的方法调用伪对象,而不是IExtensionManager的原本实现,因此需要在代码中引入一个接缝,然后插入桩

依赖注入:在被测试单元中注入一个伪实现

参数注入

方法签名添加一个参数,从而给这个方法传入一个(伪造的)依赖实例

  1. Method(string,int,FakeClass)
  2. //其中FakeClass就是注入的依赖实例。

猜你在找的设计模式相关文章