桩破除依赖3-属性注入

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

属性get或set注入伪对象

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

在使用属性注入时,要为每个要注入的依赖添加一个属性get和set,然后在被测试的代码中需要的地方使用这些依赖。 使用属性注入依赖,比使用构造函数简单,因为每个测试可以只设置自己需要的属性。 但是在使用属性前,应该先构造一个被注入依赖的实例,以便在不注入属性时使用。下面程序中有相应说明。

下面是伪代码

  1. //属性注入,伪代码
  2. public IExtensionManager Manager
  3. {
  4. get { return m_manager; }
  5. set { m_manager = value; }
  6. }
  7. IExtensionManager m_manager
  8.  
  9. IsValidFileName(string)
  10. {
  11. if (m_manager.IsValid(file))
  12. ...
  13. }

实现代码如下:

  1. class LogAnalyzerPropertyInject
  2. {
  3. private IExtensionManager manager;
  4. public LogAnalyzerPropertyInject()
  5. {
  6. //调用类的时候构造,如果不使用下面的属性,则这个起作用。
  7. //这样就做到了使用属性是可选的,在不用属性的情况下正常使用。
  8. manager = new FileExtensionManager();
  9. }
  10. public IExtensionManager ExtensionManager
  11. {
  12. //在使用属性时,就可以把上面构造的FileExtensionManager() 覆盖掉了。
  13. get { return manager; }
  14. set { manager = value; }
  15. }
  16.  
  17. public bool IsValidLogFileName(string fileName)
  18. {
  19. return manager.IsValid(fileName);
  20. }
  21.  
  22.  
  23. //下面两个是定义的实现类和对应抽象出来的接口
  24. public interface IExtensionManager
  25. {
  26. bool IsValid(string fileName);
  27. }
  28.  
  29. public class FileExtensionManager : IExtensionManager
  30. {
  31. public bool IsValid(string fileName)
  32. {
  33. //读取文件
  34. if (string.IsNullOrEmpty(fileName))
  35. {
  36. throw new ArgumentException("filename has to be provided");
  37. }
  38. if (!fileName.EndsWith(".SLF",StringComparison.CurrentCultureIgnoreCase))
  39. {
  40. return false;
  41. }
  42.  
  43. return true;
  44. }
  45. }
  46. }

测试代码如下:

  1. [TestFixture]
  2. public class LogAnalyzerPropertyInjectTests
  3. {
  4. [Test]
  5. public void IsValidFileName_SupportExtension_ReturnTrue()
  6. {
  7. //使用前面构造函数注入用的桩
  8. FakeExtensionManager myFakeManager = new FakeExtensionManager();
  9. myFakeManager.WillBeValid = true;
  10.  
  11. LogAnalyzerPropertyInject log = new LogAnalyzerPropertyInject();
  12. log.ExtensionManager = myFakeManager;
  13.  
  14. bool result = log.IsValidLogFileName("anything.anyextension");
  15. Assert.True(result);
  16. }
  17. }

使用属性注入的时机

如果想表明被测试类的某个依赖项是可选的,或者测试可以放心使用默认创建的这个依赖项实例,就可以使用属性注入。

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