美文网首页
{C#-05A} 单测.替换

{C#-05A} 单测.替换

作者: 码农猫爸 | 来源:发表于2020-09-09 11:04 被阅读0次

背景

  • 单测本质:用已知(小环境),验未知(方法|属性)。
  • 小环境在生产时是动态值,测试时需替换为模拟值(可多样本)。

注入法

  • 可注入接口|类,因整体替换更简洁。
  • A类调用B类,平行开发无B类时也能完成A类编写和单测。
  • 生产代码与单测代码隔离。

内联法

  • 可替换方法和属性,逐一替换显琐碎。
  • 减少了接口|传参数量。

代码例(亲测有效)

  • 注入法
using Moq;
using System;
using System.Diagnostics;
using Xunit;

namespace Injection
{
    public interface IValidator
    {
        bool Validate();
    }

    public class Inner : IValidator // 被调用类
    {
        public bool Validate() => throw new NotImplementedException();
    }

    public class Outer // 调用类
    {
        private IValidator validator;

        // 传参
        public Outer(IValidator validator) => this.validator = validator;

        public string GetMessage() => validator.Validate() ? "合法" : "非法";
    }

    public class Production // 生产环境
    {
        private Outer outer;

        public Production() => outer = new Outer(new Inner());

        public void Do() => Debug.Print(outer.GetMessage());
    }

    public class OuterTests // 单测环境
    {
        private Mock<IValidator> mock = new Mock<IValidator>();
        private Outer outer;

        [Theory(DisplayName = "演示")]
        [InlineData(true, "合法")]
        [InlineData(false, "非法")]
        public void GetMessage_ReturnsTrue(bool valid, string expected)
        {
            mock
                .Setup(x => x.Validate())
                .Returns(valid);
            outer = new Outer(mock.Object);

            string actual = outer.GetMessage();

            Assert.Equal(expected, actual);
        }
    }
}
  • 内联法
using Moq;
using Moq.Protected;
using System;
using System.Diagnostics;
using Xunit;

namespace Inline
{
    public class Inner // 被调用类
    {
        public bool Validate() => throw new NotImplementedException();
    }

    public class Outer // 调用类
    {
        private Inner inner = new Inner(); // 内联,不传参

        public string GetMessage() => Validate() ? "合法" : "非法";

        protected virtual bool Validate() => inner.Validate();
    }

    public class Production // 生产环境
    {
        private Outer outer;

        public Production() => outer = new Outer();

        public void Do() => Debug.Print(outer.GetMessage());
    }

    public class OuterTests // 单测环境
    {
        private Mock<Outer> mock = new Mock<Outer>();

        [Theory(DisplayName = "演示")]
        [InlineData(true, "合法")]
        [InlineData(false, "非法")]
        public void GetMessage_ReturnsTrue(bool valid, string expected)
        {
            mock.Protected()
                .Setup<bool>("Validate")
                .Returns(valid);

            string actual = mock.Object.GetMessage();

            Assert.Equal(expected, actual);
        }
    }
}

相关文章

  • {C#-05A} 单测.替换

    背景 单测本质:用已知(小环境),验未知(方法|属性)。 小环境在生产时是动态值,测试时需替换为模拟值(可多样本)...

  • {C#-05C} 单测.复合方法

    背景 合成多个子方法时传参多,责任不清时难单测 代码例 环境类 环境类单测 子函数 子函数单测 复合函数 复合函数单测

  • Android studio里单测覆盖率报告生成

    在Android studio里,单测分为本地单测和Android单测两种,区别在于是否需要使用dvm虚拟机,前者...

  • 数据分析之 pandas 高级

    替换操作 替换操作可以同步作用于Series和DataFrame中 单值替换: 替换所有符合要求的元素 : to...

  • 徒手撸一个Mock框架(一)——如何创建一个mock对象

    自从老夫换了一个新厂之后,单测就写个不停,因为新厂对单测的要求还是比较高的。 在撸单测的过程中,用Mockito,...

  • iOS-单元测试

    单测在比较大的项目中会使用到,下面的几个东西是单测常用的工具,供大家参考。LCOV - 单测覆盖率报告生成工具;O...

  • 实验的变量与设计(四)

    (四)真实验设计 1单因素完全随机两等组设计 (1)单因素完全随机等组前测后测设计 统计方法1: 两组前测后测差值...

  • 最差的准实验设计是单组前测后测设计——课程笔记

    最差的准实验设计是单组前测后测设计。 因为单组前测后测设计中存在5种内部效度威胁:1趋中回归、2被试流失、3测验因...

  • 单测原则

    为何使用单元测试 它可以测试现有以及未来的功能模块,保证了代码质量。它强制你书写具有可测性,低耦合的代码。这比手工...

  • 谈谈单测

    个人认为, 一名菜鸟进阶到高级软件工程师需要的基本素质之一就是写单测! 作为一名菜鸟, 我刚开始也是排斥单测! 但...

网友评论

      本文标题:{C#-05A} 单测.替换

      本文链接:https://www.haomeiwen.com/subject/gvasektx.html