JustMock .NET单元测试利器(二)JustMock基础

简介: JustMock API基础 Mock是Telerik®JustMock框架中的主要类。Mock用于创建实例和静态模拟,安排和验证行为。 本文将介绍 “Mock”的基本用法: 首先我们创建一个IFoo对象   publicinterfaceIFoo { intBar{get;set;} voidToString(); }   创建实例模拟 要创建实Mock实例,您需要使用该Mock.Create方法或其通用版本Mock.Create。

JustMock API基础

MockTelerik®JustMock框架中的主要类。Mock用于创建实例和静态模拟,安排和验证行为。

本文将介绍 “Mock”的基本用法:

首先我们创建一个IFoo对象

 

publicinterfaceIFoo

{

    intBar{get;set;}

    voidToString();

}


 

创建实例模拟

要创建实Mock实例,您需要使用该Mock.Create方法或其通用版本Mock.Create<T>。有了这个,你创建一个虚假的对象,取代你的测试中的真实对象。

var foo =Mock.Create<IFoo>();

此外,您可以指定初始化传递给构造函数参数。

 

publicclassFoo

{

    publicFoo(int arg)

    {

    }

}


 

 

对应的单元测试如下:

 

[TestMethod]

    publicvoidSimpleTestMethod()

    {

        //Arrange

        var foo =Mock.Create(()=>newFoo(1));

 

        //Assert

        Assert.IsNotNull(foo);

}


 

Arrange

Arrange方法用于更改模拟方法或属性调用的行为。它与本节中描述的一个或多个支持的行为一起使用:

·        CallOriginal() - 使用原来的方法执行。

·        DoInstead() - 调用方法时执行自定义代码。

·        Initialize() - 设置所有的框架方法。

·        DoNothing() - 忽略呼叫。此方法仅用于可读性,仅适用于void方法。

·        MustBeCalled() - 标记该方法在执行测试期间声明它被调用。

·        Raise() - 提出嘲笑的事件。

·        Raises() - 一旦方法被调用,就提出一个事件。

·        Returns() - 使用非void方法返回一个自定义值。

·        Throws() - 调用方法后抛出异常。

以下是如何安排方法调用返回自定义指定值的示例。

 

[TestMethod]

    publicvoidArrangingAMethodCallToReturnACustomValue()

    {

        //Arrange

        var foo =Mock.Create<IFoo>();

 

        Mock.Arrange(()=> foo.Bar).Returns(10);

}


 

如果你想模拟一个属性集,而不是使用“Arrabge”方法你应该使用“ArrangeSet”方法。下面的例子演示了如何当属性设置为特定值时抛出异常。

 

[TestMethod]

    publicvoidArrangingAPropertySetToThrowAnException()

    {

        //Arrange

        var foo =Mock.Create<IFoo>();

 

        Mock.ArrangeSet(()=> foo.Bar=0).Throws<ArgumentException>();

}


 

Arrange - 使用具有动态值的表达式

Arrange方法还允许您在参数表达式中使用动态值。这使您可以对使用lambda表达式的排列进行细化控制。让我们来看看下面的场景:

 

publicclassBookService

{

    privateIBookRepository repository;

 

    publicBookService(IBookRepository repository)

    {

        this.repository = repository;

    }

 

    publicBookGetSingleBook(int id)

    {

        return repository.GetWhere(book => book.Id== id);

    }

}

 

publicinterfaceIBookRepository

{

    BookGetWhere(Expression<Func<Book,bool>> expression);

}

 

publicclassBook

{

    publicintId{get;privateset;}

    publicstringTitle{get;set;}

}


 

在这里,我们有一个BookService我们用来从知识库中获取特定的书籍。在IBookRepository只有一个方法GetWhere其用于返回一个Book由附带作为参数λ表达式指定。看看使用lambda表达式来获取具有特定属性的书GetSingleBookBookService类的方法id

在下面的测试中,我们在Arrange阶段中使用lambda表达式:

 

[TestMethod]

    publicvoidShouldAssertMockForDynamicQueryWhenComparedUsingAVariable()

    {

        //Arrange

        var repository =Mock.Create<IBookRepository>();

        var expected =newBook{Title="Adventures"};

        var service =newBookService(repository);

 

        Mock.Arrange(()=> repository.GetWhere(book => book.Id==1))

            .Returns(expected)

            .MustBeCalled();

 

        //Act

        var actual = service.GetSingleBook(1);

 

        //Assert

        Assert.AreEqual(actual.Title, expected.Title);

}


 

我们指定,当存储库GetWhere方法被调用id=1时,返回的书应该是特定的书。然后我们采取行动 - 我们执行的GetSingleBook方法,BookService我们断言预期的书被返回。

从构造函数参数中自动排列虚拟属性集

正如你在上面第一节看到的那样,当你使用时Mock.Create,你可以指定初始化参数传递给创建的对象的构造函数。当构造函数设置包含在你正在模拟的类型中的虚拟属性的值时,可以用Mock.Create同样的方法。结果将是虚拟属性的值将被自动排列。我们来看一个演示这个特性的例子:

 

publicclassItem

    {

        publicvirtualstringName{get;set;}

 

        publicItem(string name)

        {

            Name= name;

        }

    }

 

    [TestMethod]

    publicvoidShouldAutoArrangePropertySetInConstructor()

    {

        //Arrange

        var expected ="name";

        var item =Mock.Create<Item>(()=>newItem(expected));

 

        //Assert

        Assert.AreEqual(expected, item.Name);

}


 

Assert- 验证行为

在您安排某些方法/属性调用的行为并执行操作之后,您需要验证返回的结果或一般行为。你用这个Mock.Assert方法做这个。

让我们Assert一个排列方法实际上是被调用的。

 

[TestMethod]

    publicvoidTestMethodShowingAssertFunctionality()

    {

        //Arrange

        var foo =Mock.Create<IFoo>();

 

        Mock.Arrange(()=> foo.ToString()).MustBeCalled();

 

        //Act

        foo.ToString();

 

        //Assert

        Mock.Assert(foo);

}


 

即使你不安排方法调用,你仍然可以断言该方法是否被调用。您也可以像调用方法一样断言属性获取调用。

 

[TestMethod]

    publicvoidTestMethodShowingAssertFunctionalityOnPropGet()

    {

        //Arrange

        var foo =Mock.Create<IFoo>();

        Mock.Arrange(()=> foo.Bar).Returns(10);

 

        //Act

        var returnValue =foo.Bar;

 

        //Assert

        Assert.AreEqual(10,returnValue);

    }


 

断言属性, “您需要使用”Mock.AssertSet“。为了演示使用的模拟.AssertSet'我们将使用前面提到的行为在这个主题之一,即”MustBeCalled“。我们将验证属性实际上是设置在测试运行。

 

[TestMethod]

    publicvoidTestMethodShowingAssertFunctionalityOnPropSet()

    {

        //Arrange

        var foo =Mock.Create<IFoo>();

        Mock.ArrangeSet(()=> foo.Bar=0).MustBeCalled();

 

        //Act

        foo.Bar=0;

 

        //Assert

        Mock.Assert(foo);

    }


 

让我们用一个稍微复杂的例子来完成这个话题。您可能会遇到返回值列表的情况。下一个示例演示如何验证返回的项目的数量并声明调用了特定的方法。

对于这个例子,我们将使用以下内容IFooRepository

 

publicinterfaceIFooRepository

{

    List<Foo>GetFoos{get;set;}

}

 

[TestMethod]

    publicvoidVerifyingNumbersOfReturnedItemsAndAssertingAMethodIsCalled()

    {

        //Arrange

        var repository =Mock.Create<IFooRepository>();

 

        List<Foo> list =newList<Foo>(){

            newFoo(1),

            newFoo(2),

            newFoo(3),

            newFoo(4),

            newFoo(5)

        };

 

        Mock.Arrange(()=> repository.GetFoos).Returns(list).MustBeCalled();

 

        //Act

        IList<Foo> foos = repository.GetFoos;

 

        var expected =5;

        var actual = foos.Count;

 

        //Assert

        Assert.AreEqual(expected, actual);

 

        Mock.Assert(repository);

}


 

 

参考文献:

http://docs.telerik.com/devtools/justmock/getting-started/mock#auto-arrange-virtual-properties-set-from-constructor-arguments

 

相关文章
|
2月前
|
测试技术 持续交付 API
深入挖掘探索.NET单元测试
【10月更文挑战第11天】
43 2
|
14天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
60 13
|
2月前
|
测试技术 API 开发者
精通.NET单元测试:MSTest、xUnit、NUnit全面解析
【10月更文挑战第15天】本文介绍了.NET生态系统中最流行的三种单元测试框架:MSTest、xUnit和NUnit。通过示例代码展示了每种框架的基本用法和特点,帮助开发者根据项目需求和个人偏好选择合适的测试工具。
46 3
|
1月前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
|
4月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
51 8
|
4月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
406 8
|
4月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
56 0
|
4月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
209 0
|
5月前
|
测试技术 C#
.NET单元测试使用Bogus或AutoFixture按需填充的几种方式和最佳实践
【7月更文挑战第13天】AutoFixture 和 Bogus 都是流行的 C#库,用于在单元测试中按需填充测试数据。以下是它们的几种使用方式和最佳实践:一、AutoFixture:1.直接定制 2.使用匿名函数 3.实现ICustomization接口 4.使用Build方法。 二、最佳实践Bogus:1.安装2.使用。
|
4月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了