美文网首页
{C#-05C} 单测.复合方法

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

作者: 码农猫爸 | 来源:发表于2020-10-01 21:23 被阅读0次
背景
  • 合成多个子方法时传参多,责任不清时难单测
代码例
  • 环境类
namespace Presenters
{
    public class SchemaEnviroment
    {
        // 输出(需单测)
        // 外部环境上再加工
        // 虚方法,本类作为外部环境时,可替换为模拟值,下同。
        public virtual string Position =>
            Server.StartsWith("127.") ||
            Server == "localhost" ? "local" : "net";
        // ...

        // 输出(不单测)
        // 直接调用外部模块的方法或属性,即过桥
        public virtual string[] Schemas
            => new KD.SchemaQuery().GetSchemas(true)
                .Keys.ToArray();
        // ...

        // 输入
        // 内生受保护的虚方法,无接口,减少注入层级
        // 也可换作接口注入,但增加代码和理解的复杂度
        protected virtual string Server
            => ConfigIO.Server;
        // ...
    }
}
  • 环境类单测
namespace Tests
{
    public class SchemaEnviromentTests
    {
        Mock<SchemaEnviroment> mock = new Mock<SchemaEnviroment>();

        [Theory(DisplayName = "位置")]
        [InlineData("127.0.0.1", "local")]
        [InlineData("localhost", "local")]
        [InlineData("128.0.0.1", "net")]
        public void Position_ReturnsTrue(string server, string expected)
        {
            Reset(server);
            string actual = mock.Object.Position;

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

        private void Reset(string server = "127.0.0.1")
        {
             mock.CallBase = true;
             mock.Protected()
                .Setup<string>("Server")
                .Returns(server);
            // ...
        }
    }
}
  • 子函数
namespace Presenters
{
    public class SchemaSuggestion
    {
        private SchemaEnviroment env;

        public SchemaSuggestion(SchemaEnviroment env)
        {
            this.env = env;
        }

        public virtual string ToClear(string input)
            => input == "" ? null : "[清空]";
        // ...        
    }
}
  • 子函数单测
namespace Tests
{
    public class SchemaSuggestionTests
    {
        Mock<SchemaSuggestion> mock;

        [Theory(DisplayName = "待清空")]
        [InlineData("", null)]
        [InlineData("any", "[清空]")]
        public void ToClear_ReturnsTrue(string input, string expected)
        {
            Reset();
            string actual = mock.Object.ToClear(input);

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

        private void Reset(bool isDev = true)
        {
            Mock<SchemaEnviroment> env = new Mock<SchemaEnviroment>();
            env.Setup(x => x.Position).Returns("local");
            // ..

            mock = new Mock<SchemaSuggestion>(env.Object);
            mock.CallBase = true; // 使用原函数,不替换
        }
    }
}
  • 复合函数
namespace Presenters
{
    public class SchemaName
    {
        private SchemaSuggestion suggestion;

        public SchemaName(SchemaSuggestion suggestion)
        {
            this.suggestion = suggestion;
        }

        public List<string> Suggest(string input)
        {
            var result = new List<string>
            {
                suggestion.ToClear(input),
                // ...
            };

            result.AddRange(suggestion.ToFilter(input));

            return result.FindAll(name => name != null);
        }
    }
}
  • 复合函数单测
namespace Tests
{
    public class SchemaNameTests
    {
        Mock<SchemaName> mock;

        [Fact(DisplayName = "建议")]
        public void Suggest_ReturnsTrue()
        {
            var expected = SuggestStub();

            Reset();
            var actual = mock.Object.Suggest(""); // 待清空=null

            Assert.Equal(expected, actual);
        }

        private List<string> SuggestStub()
            => new List<string> {  // ...  };

        private void Reset()
        {
            Mock<SchemaSuggestion> suggestion = new Mock<SchemaSuggestion>(null);
            suggestion
                .Setup(x => x.ToClear(It.IsAny<string>()))
                .Returns((string)null);
            // ...

            mock = new Mock<SchemaName>(suggestion.Object);
        }
    }
}

相关文章

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

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

  • spring boot线程池使用

    线程池配置 线程池方法定义 单测调用

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

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

  • Vue单元测试文档

    我们单元测试主要是对Vue组件进行单测单测使用 Jest 框架, 方法库用集成jest的 Vue Test Uti...

  • Pandas中set_index和reset_index的用法及

    1.set_index DataFrame可以通过set_index方法,可以设置单索引和复合索引。DataFra...

  • Pandas中set_index和reset_index的用法及

    1.set_index DataFrame可以通过set_index方法,可以设置单索引和复合索引。DataFra...

  • 玻璃心:有必要测单删吗

    内心脆弱敏感、自卑的玻璃心,有必要测微信单删吗? 不要。 我也是在几年前才知道有测单删的方法(在某平台下单)也...

  • 塔罗3# :问感情复合

    背景:求测者帮叔叔和婶婶求测感情是否复合,各自不在一个城市,分居了,看是否能复合,未来感情走势。 叔叔对问题的看法...

  • 关于js方法的单测

    基于封装的js方法库,了解了chai.js断言库以及Mocha测试框架,下面我简单介绍记录一下,以方便自己回顾。 ...

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

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

网友评论

      本文标题:{C#-05C} 单测.复合方法

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