当前位置: 首页 > 工具软件 > moq > 使用案例 >

.Net单元测试知识点及moq框架介绍

公羊浩气
2023-12-01
  1. .Net单元测试框架: moq

  2. 如果项目目的Internal方法需要再单元测试项目中引用到测试,由于默认情况下,Internal只能在同一程序集中引用,这种情况下需要在AssemblyInfo.cs中添加 “[assembly: InternalsVisibleTo(“UnitTest项目名称”)]” 使得Internal类型和方法在项目之外的单元测试项目中也可以访问到

  3. 单元测试类或方法的DeploymentItemAttribute特性:指定随着运行单元测试一起部署的目录或文件,比如
    [DeploymentItem(“sysconfig.unittest.config”)]
    [DeploymentItem(“sysconfig.testdebug.locator”)]
    [TestClass] 或者[TestMethod]
    ……

  4. [AssemlyInitialize] 定义单元测试的程序集运行时的初始方法,在[TestInitialize]之前运行, 比如: 在测试项目中建如下测试类,在里面建如下[AssemlyInitialize] 初始化方法:
    [TestClass]
    public class Startup
    {
    [AssemlyInitialize]
    public static void MyTestInit(TestContext testContext)
    {
    TestConfigure.Initialize();
    }
    }

  5. [ClassInitialize] :类似[AssemlyInitialize] 的作用,只是定义类的初始化方法

  6. [TestInitialize]在测试类中指定每次单元测试方法运行之前都运行的“初始方法”(有2个DataRow或者带回2组测试参数DynamicData的单元测试方法2次运行前也都会2次分别先运行“初始方法”)

  7. 与以上3、4、5相对应的有[TestCleanup]、[ClassCleanup]、[AssemblyCleanup],用于测试方法执行之后执行,比如释放资源等操作

  8. [Ignore]定义不执行的测试方法,比如临时未能跑通的测试方法暂时保存时很有用,而不用注释掉代码

  9. 结合多组参数数据对单元测试方法进行测试:
    [DataTestMethod]
    [DataRow(1,2,…,N)]
    …带参数的单元测试方法

  10. 预料执行会抛出指定的异常的单元测试方法,(默认参数下AllowDerivedTypes = false,抛出“预料异常类的子类”不视为“预料异常”)
    [ExpectedException(typeof(Exception类) , AllowDerivedTypes = false)]
    ……单元测试方法

  11. 也可以不通过特性,而通过Assert.ThrowsException<Exception类>(Action或Func)来预料执行会抛出指定的异常的单元测试方法

  12. 使用[DynamicData] 结合返回值的静态方法或属性,进行多种组合的参数化测试
    比如:

  • 例1:
    [DynamicData(nameof(GetTestData), DynamicDataSourceType.Method)] //arrange
    [TestMethod()]

    public void TestMathOps(decimal a, decimal b, Func<decimal, decimal, decimal> calculatorOperation, decimal expectedValue)
    {
    //act
    var actual = calculatorOperation(a, b);
    //assert
    Assert.AreEqual(expectedValue, actual);
    }
    And here’s the GetTestData test data generator method:
    private static IEnumerable<object[]> GetTestData()
    {
    return new List<object[]>()
    {
    new object[]{ 1.2m, 2.3m, (Func<decimal, decimal, decimal>)Calculator.Add, 3.5m },
    new object[]{ 1.5m, 0.5m, (Func<decimal, decimal, decimal>)Calculator.Subtract, 1.0m },
    new object[]{ 1.5m, 2.0m, (Func<decimal, decimal, decimal>)Calculator.Multiply, 3.0m }
    };
    }
    详见: 《C# – Use DynamicData attribute to pass functions and objects into parameterized tests》
    https://makolyte.com/csharp-use-dynamicdata-attribute-to-pass-functions-and-objects-into-parameterized-tests/
  • 例2:
    [DataTestMethod]
    [DynamicData(“TestPropVal”,DynamicDataSourceType.Property)]

    public void TestCall(Class1, int expVal)
    {

    }
    返回测试参数值的静态属性:
    private static List<object[]> TestPropVal
    {
    get
    {
    return new List<object[]>(){
    new object[]{new Class1(),0},
    new object[]{new Class1(){…},2},

    }
    }
    }
 类似资料: