JustMock .NET单元测试利器(三)用JustMock测试你的应用程序

简介: 用JustMock测试你的应用程序 本主题将指导您通过几个简单的步骤来使用Telerik®JustMock轻松测试您的应用程序。您将理解一个简单的原理,称为Arrange / Act / Assert,并熟悉框架中的核心方法和属性,这些方法和属性在最常见的测试场景中使用 为了说明下一个例子中JustMock的用法,我们将使用一个样本仓库(warehouse)和一个依赖订单对象(Order)。

JustMock测试你的应用程序

本主题将指导您通过几个简单的步骤来使用Telerik®JustMock轻松测试您的应用程序。您将理解一个简单的原理,称为Arrange / Act / Assert,并熟悉框架中的核心方法和属性,这些方法和属性在最常见的测试场景中使用

为了说明下一个例子中JustMock的用法,我们将使用一个样本仓库(warehouse)和一个依赖订单对象(Order)。仓库持有不同产品的库存。订单包含产品和数量。

仓库界面和订单类看起来像这样:

 

publicdelegatevoidProductRemoveEventHandler(string productName,int quantity);

 

publicinterfaceIwarehouse

{

    eventProductRemoveEventHandlerProductRemoved;

 

    stringManager{get;set;}

 

    boolHasInventory(string productName,int quantity);

    voidRemove(string productName,int quantity);

}

 

publicclassOrder

{

    publicOrder(string productName,int quantity)

    {

        this.ProductName= productName;

        this.Quantity= quantity;

    }

 

    publicstringProductName{get;privateset;}

    publicintQuantity{get;privateset;}

    publicboolIsFilled{get;privateset;}

 

    publicvoidFill(Iwarehouse warehouse)

    {

        if(warehouse.HasInventory(this.ProductName,this.Quantity))

        {

            warehouse.Remove(this.ProductName,this.Quantity);

        }

    }

 

    publicvirtualstringReceipt(DateTime orderDate)

    {

        returnstring.Format("Ordered {0} {1} on{2}",this.Quantity,this.ProductName, orderDate.ToString("d"));

    }

}


 

 

 

方法

DoInstead

DoInstead当您想要通过用自定义操作替换方法来更改方法的行为时,可以使用该方法。我们用上面的例子来说明如何使用DoInstead

 

[TestMethod]

    publicvoidDoInstead_TestMethod()

    {

        //Arrange

        var warehouse =Mock.Create<Iwarehouse>();

        var order =newOrder("Camera",2);

 

        bool called =false;

        Mock.Arrange(()=> warehouse.HasInventory("Camera",2)).DoInstead(()=> called =true);

 

        //Act

        order.Fill(warehouse);

 

        //Assert

        Assert.IsTrue(called);

}


 

简单的说 - 我们安排,当仓库的HasInventory方法调用参数“camera”2,我们将执行行动“ ()=>called=true ”,而不是调用实际的方法。

CallOriginal

在某些情况下,您可能希望在调用原始方法实现时使用特定的值调用该方法,并使用其他值调用模拟。为此,您可以使用该CallOriginal方法。

 

[TestMethod]

    publicvoidCallOriginal_TestMethod()

    {

        //Arrange

        var order =Mock.Create<Order>(Behavior.CallOriginal,"Camera",2);

 

        Mock.Arrange(()=> order.Receipt(DateTime.Today)).CallOriginal();

        Mock.Arrange(()=> order.Receipt(Arg.Matches<DateTime>(d => d >DateTime.Today))).Returns("InvalidDateTime");

 

        //Act

        var callWithToday =order.Receipt(DateTime.Today);

        var callWithDifferentDay = order.Receipt(DateTime.Today.AddDays(1));

 

        //Assert

        Assert.AreEqual("Ordered 2 Camera on "+DateTime.Today.ToString("d"), callWithToday);

        Assert.AreEqual("Invalid DateTime", callWithDifferentDay);

}


 

在这个例子中,我们安排当order.Receipt用参数调用DateTime.Today方法时,应该调用原来的方法实现。但是,一旦晚于日期调用相同的方法,DateTime.Today我们将返回Invalid DateTime

 

throws

Throws当你想抛出一个异常特定方法调用方法时使用。在下面的例子中,我们抛出一个无效的操作异常,试图调用仓库删除零个数量。

 

[TestMethod]

    [ExpectedException(typeof(InvalidOperationException))]

    publicvoidThrows_TestMethod()

    {

        //Arrange

        var order =newOrder("Camera",0);

        var warehouse =Mock.Create<Iwarehouse>();

 

        //Set up that the ware house has inventory of any products with any quantities.

        Mock.Arrange(()=> warehouse.HasInventory(Arg.IsAny<string>(),Arg.IsAny<int>())).Returns(true);

 

        //Set up that call to warehouse.Remove with zero quantity is invalid and throwsan exception.

        Mock.Arrange(()=> warehouse.Remove(Arg.IsAny<string>(),Arg.Matches<int>(x => x ==0)))

                    .Throws(newInvalidOperationException());

 

        //Act

        order.Fill(warehouse);

}


 

在这种情况下,我们使用ExpectedException属性Microsoft.VisualStudio.TestTools.UnitTesting来验证类型InvalidOperationException的异常是否被抛出。

 

Machers

匹配器让你忽略传递实际值作为模拟中使用的参数。相反,它们给你传递一个满足参数类型或期望值范围的表达式的可能性。例如,如果方法接受字符串作为第一个参数,则不需要传递特定的字符串,如“Camera”,而是可以使用Arg.IsAny<string>()

JustMock支持三种类型的匹配器:

1.   Arg.IsAny<[Type]>();

2.   Arg.IsInRange([FromValue : int], [ToValue : int],[RangeKind])

3.   Arg.Matches(Expression> expression)

我们来看看它们的详细用法。

Arg.IsAny();

我们已经在上面的一个例子中使用了这个匹配器。

 

Mock.Arrange(()=> warehouse.HasInventory(Arg.IsAny<string>(),Arg.IsAny<int>())).Returns(true);

 


 

这个匹配器指定当HasInventory任何字符串作为第一个参数调用方法,任何int作为第二个参数时,它应该返回true

 

Arg.IsInRangeint fromint to,RangeKind range

IsInRange匹配器让我们安排一个预期值范围的调用。通过RangeKind论证,我们可以指定给定的范围是包含还是排除其边界。

对于范围从05的参数值,将返回以下内容true

 

Mock.Arrange(()=> foo.Echo(Arg.IsInRange(0,5,RangeKind.Inclusive))).Returns(true);


 

Arg.Matches (Expression> expression)

这是最灵活的匹配器,它允许你指定你自己的匹配表达式。我们用一个简单的例子来说明:

 

Mock.Arrange(()=> foo.Echo(Arg.Matches<int>( x => x <10)).Returns(true);


 

属性

在上面的例子中,我们只模拟方法,但是你也可以用同样的方法来模拟属性。

 

[TestMethod]

    publicvoidMockingProperties_TestMethod()

    {

        //Arrange

        var warehouse =Mock.Create<Iwarehouse>();

 

        Mock.Arrange(()=> warehouse.Manager).Returns("John");

 

        string manager =string.Empty;

 

        //Act

        manager = warehouse.Manager;

 

        //Assert

        Assert.AreEqual("John", manager);

}


 

另外,还可以给属性赋值

 

[TestMethod]

    [ExpectedException(typeof(StrictMockException))]

    publicvoidMockingProperties_PropertySet_TestMethod()

    {

        //Arrange

        var warehouse =Mock.Create<Iwarehouse>(Behavior.Strict);

 

        Mock.ArrangeSet(()=> warehouse.Manager="John");

 

        //Act

        warehouse.Manager="Scott";

}


 

在安排步骤中,我们设置仓库经理只能设置为“John”。但是在行动步骤中,我们将经理设置为“Scott”。这抛出了一个模拟异常。请记住,这只会在您使用StrictBehavior创建模拟时才起作用

另一个常用的技巧是断言将属性设置为特定值会引发异常。我们来安排一下

 

[TestMethod]

    [ExpectedException(typeof(ArgumentException))]

    publicvoidMockingProperties_PropertySet_Throws_TestMethod()

    {

        //Arrange

        var warehouse =Mock.Create<Iwarehouse>();

 

        Mock.ArrangeSet(()=> warehouse.Manager="John").Throws<ArgumentException>();

 

        //Act

        //that's ok

        warehouse.Manager="Scott";

 

        //but that would throw an ArgumentException

        warehouse.Manager="John";

}


 

在这里,我们使用Throws上面讨论的方法来表明如果warehouse.Manager设置为“John”,则应抛出异常。

 

活动

该方法Raises允许您在调用方法时引发事件并传递特定的事件参数。回到我们的仓库示例,我们可能想要在调用ProductRemovedRemove方法时引发事件。

 

[TestMethod]

    publicvoidRaisingAnEvent_TestMethod()

    {

        //Arrange

        var warehouse =Mock.Create<Iwarehouse>();

 

        Mock.Arrange(()=> warehouse.Remove(Arg.IsAny<string>(),Arg.IsInRange(int.MinValue,int.MaxValue,RangeKind.Exclusive)))

            .Raises(()=> warehouse.ProductRemoved+=null,"Camera",2);

 

        string productName =string.Empty;

        int quantity =0;

 

        warehouse.ProductRemoved+=(p, q)=>{ productName = p; quantity =q;};

 

        //Act

        warehouse.Remove(Arg.AnyString,Arg.AnyInt);

 

        //Assert

        Assert.AreEqual("Camera", productName);

        Assert.AreEqual(2, quantity);

}


 

在安排步骤中,我们设置一旦仓库的Remove方法被调用,我们将ProductRemoved用参数“Camera”来提升调用事件。

 项目GitHub地址:https://github.com/liuzhenyulive/JustMockDemo

参考文献:http://docs.telerik.com/devtools/justmock/getting-started/quick-start#testing-your-application-with-justmock

 

相关文章
|
1月前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是敏捷开发环境中的重要作用和面临的挑战。通过分析自动化测试的基本原理、实施策略以及在实际项目中的应用案例,揭示了其在提高软件质量和加速产品交付方面的巨大潜力。同时,文章也指出了自动化测试实施过程中可能遇到的技术难题、成本考量及团队协作问题,并提出了相应的解决策略,为软件开发团队提供了有价值的参考和指导。
|
18天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
14天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
60 13
|
1月前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
|
23天前
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试框架在软件开发中的应用与挑战##
本文将深入探讨自动化测试框架在现代软件开发过程中的应用,分析其优势与面临的挑战。通过具体案例分析,揭示如何有效整合自动化测试以提升软件质量和开发效率。 ##
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
1月前
|
敏捷开发 监控 jenkins
探索自动化测试框架在敏捷开发中的应用与优化##
本文深入探讨了自动化测试框架在现代敏捷软件开发流程中的关键作用,分析了其面临的挑战及优化策略。通过对比传统测试方法,阐述了自动化测试如何加速软件迭代周期,提升产品质量,并针对实施过程中的常见问题提出了解决方案。旨在为读者提供一套高效、可扩展的自动化测试实践指南。 ##
41 9
|
28天前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
28 4
|
26天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
33 1
|
1月前
|
自然语言处理 安全 测试技术
基于大模型的应用的测试的一些注意事项
大模型应用测试需注意三大冲突:时间敏感性冲突,即模型数据可能随时间变得过时;数据真实性冲突,指训练数据中可能存在虚假信息,影响模型准确性;数据一致性冲突,表现为模型对语义相同但句法不同的输入反应不一。测试时应针对这些问题设计用例,确保模型性能。
61 4