zoukankan      html  css  js  c++  java
  • C# 8 & C# 9功能如何进行单元测试?这里有答案

    Telerik DevCraft最新版下载

    Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo UI、UI for ASP.NET AJAX、UI for WPF、UI for Xamarin、Reporting等众多控件。

    根据调查显示,C#仍然是最受欢迎的编程语言之一,它功能强大,易于学习并且不断改进和发展。最近几年这个语言增加了新功能,新版本不断迭代——C# 7, C# 8, C# 9。

    Progress Telerik产品始终与.NET世界中的最新的功能保持同步,C#9和JustMock也不例外。大多数新功能都易于在单元测试和模拟中使用,但是本文将为大家展示一些有趣的东西,以便您可以在单元测试中轻松使用C#功能。

    • 静态局部函数(C#8)
    • 异步方法
    • 记录
    • 初始化
    • 模式匹配

    为了说明这些,我们将使用Foo类。

    public class Foo
    {
    public Foo()
    {
    this.Bar = 10;
    this.DateTime = new DateTime(2021, 1, 1);
    }
    
    public int Bar { get; init; }
    public DateTime DateTime { get; init; }
    
    public bool IsInRange(int i) =>
    i is (>= 1 and <= 10) or (>= 100 and <= 200);
    }
    
    public record Person
    {
    public string LastName { get; }
    public string FirstName { get; }
    
    public Person(string first, string last) => (FirstName, LastName) = (first, last);
    }
    
    public record Teacher : Person
    {
    public string Subject { get; }
    
    public Teacher(string first, string last, string sub)
    : base(first, last) => Subject = sub;
    }

    注意:要运行示例,您需要从此处下载并安装JM。

    1. 首先使用Mock.Local模拟静态功能

    [TestMethod]

    public void TestStaticLocal()
    {
    // Arrange
    var sut = new Foo();
    
    // Here is how to mock the static function 
    Mock.Local.Function.Arrange<int>(sut, "MethodWithStaticLocal", "Add", Arg.Expr.AnyInt, Arg.Expr.AnyInt).Returns(1);
    
    // Act
    var result = sut.MethodWithStaticLocal();
    
    // Assert
    Mock.Assert(sut);
    Assert.AreNotEqual(12, result);
    }
    2. 异步流

    从C#8.0开始,您可以异步创建和使用流。 返回异步流的方法有三个细节:

    • 用async修饰符声明
    • 它返回一个IAsyncEnumerable<T>
    • 该方法包含yield return语句,以返回异步流中的后续元素

    在下面的示例中,您可以看到这种方法的示例以及如何进行模拟的示例:

    [TestMethod]

    public async Task TestAsyncEnumFromArray()
    {
    // Arrange
    var expected = new int[] { 10, 20, 30 };
    
    Mock.Arrange(() => Foo.GetAsyncCollection())
    .Returns(expected.GetEnumerator().ToAsyncEnumerable<int>());
    
    // Act
    var result = Foo.GetAsyncCollection();
    
    // Assert
    Mock.Assert<Foo>();
    int index = 0;
    await foreach (var number in result)
    {
    Assert.AreEqual(expected[index++], number);
    }
    }
    3. 仅初始化设置器

    仅Init的设置器提供一致的语法来初始化对象的成员,属性初始值设定项可清楚表明哪个值正在设置哪个属性,缺点是这些属性必须可设置。 从C#9.0开始,可以为属性和索引器创建init访问器,而不是设置访问器。

    编写测试时如何模拟它? 使用JustMock的Mock.NonPublic.ArrangeSet方法。

    [TestMethod]

    public void TestInit()
    {
    // Arrange 
    var fooMock = Mock.Create<Foo>();
    bool properyInitCalled = false;
    
    Mock.NonPublic.ArrangeSet(fooMock, "Bar", 10)
    .IgnoreInstance()
    .DoInstead(() => properyInitCalled = true);
    
    // Act 
    var foo = new Foo();
    
    // Assert 
    Assert.IsTrue(properyInitCalled);
    }

    或者

    [TestMethod]

    public void TestInit2()
    {
    // Arrange 
    var fooMock = Mock.Create<Foo>(Constructor.NotMocked);
    dynamic fooMockWrapper = Mock.NonPublic.Wrap(fooMock);
    
    Mock.NonPublic.Arrange(fooMockWrapper.Bar = 10)
    .IgnoreInstance()
    .MustBeCalled();
    
    // Act 
    var foo = new Foo();
    
    // Assert 
    Mock.NonPublic.Assert(fooMockWrapper.Bar = 10, Occurs.Once());
    }
    4. 模式匹配

    C#语言的另一个很棒的补充是模式匹配,这位C#开发人员提供了更多的创造力和灵活性!

    正如文档所说,基本上您要查看给定的结构,然后根据其外观识别并确定其结构,然后就可以立即使用它。

    为了向您展示如何使用InRange方法模拟这些功能,这是我们的模式匹配示例,然后是下面的测试:

    public bool IsInRange(int i) =>
    i is (>= 1 and <= 10) or (>= 100 and <= 200);
    
    ...
    
    [TestMethod]
    public void Mock_PatternMatchingTest()
    {
    // Arrange
    var foo = Mock.Create<Foo>(Behavior.CallOriginal);
    Mock.Arrange(() => foo.IsInRange(Arg.AnyInt)).Returns(true);
    
    // Act
    var result20 = foo.IsInRange(20);
    var result150 = foo.IsInRange(150);
    
    //Assert
    Assert.AreEqual(true, result20);
    Assert.AreEqual(true, result150);
    }

    我知道读取代码与运行代码并不相同,因此要使用它并使用示例,请按照以下步骤操作:


    了解最新Kendo UI最新资讯,请关注Telerik中文网!

  • 相关阅读:
    Vue和React组件diff更新影响范围对比
    ES6中import和CommonJS中require的区别
    MutationObserver监听DOM变化
    Mint UI中文官网
    为什么在浏览器不支持H265视频播放
    Google谷歌官网首页涂鸦记录
    windows键盘输入无效,键盘灯亮,打字不出字
    javascript实现跨域的方法汇总
    javascript中setInterval的用法
    浅谈Javascript数组的使用
  • 原文地址:https://www.cnblogs.com/AABBbaby/p/14651671.html
Copyright © 2011-2022 走看看