DotNet笔记--Unit Test With Fake

本文详细介绍了在单元测试中如何通过伪代码和模拟技术解决类间依赖问题,特别是当涉及到接口调用时的实现方式。通过实例演示了如何在测试环境中创建和配置模拟对象,以及如何在不修改实际业务逻辑的情况下,验证特定方法的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 简单说一下DotNet Unit Test

  Unit Test属于白盒测试的一种,直接针对代码进行测试,测试的单位往往是Method.如果测试的程序集没有其他的依赖引用,这种测试就很简单了,设置各种用例执行即可。但是,现实环境是复杂的,一个软件产品往往是由多层构成的,每个层往往分布于多个程序集中,这样导致的结果就是,为了获取来自其他层次的数据就很困难。举例来说,A的MethodA依赖于B中的MethodB,那么如何解除这种依赖呢?

  微软给出了解决方案。

  但是这种依赖又是分为两种情况的:1)B中的方法是基于接口的  2)B中的方法是没有接口的

  针对这这两种情况,微软分别给出了Stub和Shim两种技术术语。但是很显然:1)我们自己生产的软件是鼓励进行接口编程的 2)对于第三方的库的输出往往是可以预计的。因此我们暂时先搞明白stub这种情况。

  B中有接口,我们依赖于其中一个方法,那么进行分离的最朴素的想法就是我们自己实现其接口,然后由我们自己的实现返回那个接口,这样一种“Substitute”就解耦了:

  这个技术有两个特点(依赖于程序集B,程序集的名称暂时成为Assembly.B):

  1)在测试工程的referrence列表中找到Assembly.B,然后右键选择“Add Faske”,系统默认生成了Assembly.B.Fake这个冒牌货

  2)实现其中的方法,在实现过程中构造我们的Fake数据

  接口定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FakeTestLib
{
    public interface CommonBaseIntf
    {
        Int32 SumTwoNum(
            Int32 i_firstPara,
            Int32 i_secPara
            );

        Int32 Num
        {
            get;
            set;
        }
    }
}

 系统生成的Fake类型定义:

#region Assembly FakeTestLib.Fakes.dll, v1.0.0.0
// D:\PrivateCodePath\Rainy.Draft\TestWithFakeStub\FakesAssemblies\FakeTestLib.Fakes.dll
#endregion

using FakeTestLib;
using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.QualityTools.Testing.Fakes.Stubs;
using System;
using System.Diagnostics;

namespace FakeTestLib.Fakes
{
    // Summary:
    //     Stub type of FakeTestLib.CommonBaseIntf
    [DebuggerDisplay("Stub of CommonBaseIntf")]
    [DebuggerNonUserCode]
    [StubClass(typeof(CommonBaseIntf))]
    public class StubCommonBaseIntf : StubBase<CommonBaseIntf>, CommonBaseIntf
    {
        // Summary:
        //     Sets the stub of CommonBaseIntf.get_Num()
        public FakesDelegates.Func<int> NumGet;
        //
        // Summary:
        //     Sets the stub of CommonBaseIntf.set_Num(Int32 value)
        public FakesDelegates.Action<int> NumSetInt32;
        //
        // Summary:
        //     Sets the stub of CommonBaseIntf.SumTwoNum(Int32 i_firstPara, Int32 i_secPara)
        public FakesDelegates.Func<int, int, int> SumTwoNumInt32Int32;

        // Summary:
        //     Initializes a new instance of type StubCommonBaseIntf
        public StubCommonBaseIntf();

        // Summary:
        //     Attaches delegates to emulate StubCommonBaseIntf.Num as a property with a
        //     backing field.
        public void AttachBackingFieldToNum();
    }
}

  测试实现:

 

    public void TestSumTwoNum()
        {
            var baseIntf = new FakeTestLib.Fakes.StubCommonBaseIntf()
            {
                SumTwoNumInt32Int32 = (first, sec) =>
                    {
                        var result = 0;
                        checked
                        {
                            result = 200;
                        }
                        return result;
                    },
            };

            Assert.IsTrue(baseIntf is CommonBaseIntf);

            Assert.AreEqual(200, baseIntf.SumTwoNumInt32Int32(10, 190));
        }

 

转载于:https://www.cnblogs.com/rainychan/p/4897524.html

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值