桩破除依赖3-属性注入

用属性get或set注入伪对象

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

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

下面是伪代码

//属性注入,伪代码
public IExtensionManager Manager
{
    get { return m_manager; }
    set { m_manager = value; }
}
IExtensionManager m_manager

IsValidFileName(string)
{
    if (m_manager.IsValid(file))
    ...
}

属性注入的原理

实现代码如下:

class LogAnalyzerPropertyInject
{
    private IExtensionManager manager;
    public LogAnalyzerPropertyInject()
    {
        //调用类的时候构造,如果不使用下面的属性,则这个起作用。
        //这样就做到了使用属性是可选的,在不用属性的情况下正常使用。
        manager = new FileExtensionManager();
    }
    public IExtensionManager ExtensionManager
    {
        //在使用属性时,就可以把上面构造的FileExtensionManager() 覆盖掉了。
        get { return manager; }
        set { manager = value; }
    }

    public bool IsValidLogFileName(string fileName)
    {
        return manager.IsValid(fileName);
    }


    //下面两个是定义的实现类和对应抽象出来的接口
    public interface IExtensionManager
    {
        bool IsValid(string fileName);
    }

    public class FileExtensionManager : IExtensionManager
    {
        public bool IsValid(string fileName)
        {
            //读取文件
            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("filename has to be provided");
            }
            if (!fileName.EndsWith(".SLF", StringComparison.CurrentCultureIgnoreCase))
            {
                return false;
            }

            return true;
        }
    }
}

测试代码如下:

[TestFixture]
public class LogAnalyzerPropertyInjectTests
{
    [Test]
    public void IsValidFileName_SupportExtension_ReturnTrue()
    {
        //使用前面构造函数注入用的桩
        FakeExtensionManager myFakeManager = new FakeExtensionManager();
        myFakeManager.WillBeValid = true;

        LogAnalyzerPropertyInject log = new LogAnalyzerPropertyInject();
        log.ExtensionManager = myFakeManager;

        bool result = log.IsValidLogFileName("anything.anyextension");
        Assert.True(result);
    }
}

使用属性注入的时机

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

转载于:https://my.oschina.net/zhv/blog/908508

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值