隔离框架3-对象和属性的对比

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

对象和属性的对比

被测代码

public class LogAnalyzer3
{
    private ILogger _logger;
    private IWebService _webService;


    public LogAnalyzer3(ILogger logger,IWebService webService)
    {
        _logger = logger;
        _webService = webService;
    }

    public int MinNameLength { get; set; }

    public void Analyze(string filename)
    {
        if (filename.Length<MinNameLength)
        {
            try
            {
                _logger.LogError(string.Format("Filename too short: {0}",filename));
            }
            catch (Exception e)
            {
                _webService.Write(new ErrorInfo(1000, e.Message));

            }
        }
    }
}

为了对比对象,需要实现Equals的重写

public class ErrorInfo
{
    private readonly int _severity;
    private readonly string _message;

    public ErrorInfo(int severity, string message)
    {
        _severity = severity;
        _message = message;
    }

    public int Severity
    {
        get { return _severity; }
    }

    public string Message
    {
        get { return _message; }
    }

    protected bool Equals(ErrorInfo other)
    {
        return _severity == other._severity && string.Equals(_message, other._message);
    }

    //this is needed to make this test pass:
    // Analyze_LoggerThrows_CallsWebServiceWithNSubObjectCompare
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((ErrorInfo) obj);
    }
}

测试带有属性的对象

//测试带有属性的对象
//在调用WebService.Write方法时,使用了一个带有severity和message属性的ErrorInfo对象。
[Test]
public void Analyze_LoggerThrows_CallsWebServiceWithNSubObject()
{
    //1. 创建伪对象
    var mockWebService = Substitute.For<IWebService>();
    var stubLogger = Substitute.For<ILogger>();

    //2. 对桩做设置
    stubLogger.When(logger => logger.LogError(Arg.Any<string>()))
        .Do(info => { throw new Exception("fake exception"); });

    //3. 给被测方法注入桩和模拟对象
    var analyzer = new LogAnalyzer3(stubLogger, mockWebService);
    analyzer.MinNameLength = 8;
    analyzer.Analyze("short.txt");

    //4. 对模拟对象进行检查
    //使用and操作符创建比较复杂的预期结果,这里就是和检查单个值不一样的地方
    mockWebService.Received().Write(Arg.Is<ErrorInfo>(info =>
        info.Severity == 1000 && info.Message.Contains("fake exception")));
}

比较整个对象

//对整个对象做比较
//在上一章就没比较成功,因为需要重写objects.Equals()方法
[Test]
public void Analyze_LoggerThrows_CallsWebServiceWithNSubObjectCompare()
{
    var mockWebService = Substitute.For<IWebService>();
    var stubLogger = Substitute.For<ILogger>();

    stubLogger.When(logger => logger.LogError(Arg.Any<string>()))
        .Do(info => { throw new Exception("fake exception"); });

    var analyzer = new LogAnalyzer3(stubLogger, mockWebService);
    analyzer.MinNameLength = 10;
    analyzer.Analyze("test.txt");

    //直接比较对象有个问题是一般会返回false,必须实现Equals()方法才能正确比较
    var expected = new ErrorInfo(1000, "fake exception");
    //这里断言是否得到了同样的对象(expected),本质上用的就是assert.equals()
    mockWebService.Received().Write(expected);
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值