JustMock API基础

Mock是Telerik®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表达式来获取具有特定属性的书GetSingleBook的BookService类的方法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

JustMock .NET单元测试利器(二)JustMock基础的更多相关文章

  1. JustMock .NET单元测试利器(一)

    1.什么是Mock? Mock一词是指模仿或者效仿,用于创建实例和静态模拟.安排和验证行为.在软件开发中提及"mock",通常理解为模拟对象.模拟对象的概念就是我们想要创建一个可以 ...

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

    用JustMock测试你的应用程序 本主题将指导您通过几个简单的步骤来使用Telerik®JustMock轻松测试您的应用程序.您将理解一个简单的原理,称为Arrange / Act / Assert ...

  3. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  4. PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...

  5. LINUX二十个基础命令

    LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...

  6. [转]前端利器:SASS基础与Compass入门

    [转]前端利器:SASS基础与Compass入门 SASS是Syntactically Awesome Stylesheete Sass的缩写,它是css的一个开发工具,提供了很多便利和简单的语法,让 ...

  7. Swift语言指南(二)--语言基础之注释和分号

    原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单 ...

  8. PHP单元测试利器:PHPUNIT初探

    开始动手安装phpunit 本文中将通过介绍php中的单元测试利器phpunit(http://phpunit.de/),并通过实际例子来讲解如何在实际工作中运用phpunit.首先安装phpunit ...

  9. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

随机推荐

  1. bzoj 4825: [Hnoi2017]单旋 [lct]

    4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...

  2. POJ Christmas Game [树上删边游戏 Multi-SG]

    传送门 题意: 有N 个局部联通的图.Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走.Sally 为先手.图是通过从基础树中加一些边得到的.所有形成的环保证不共用 ...

  3. 一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3

    本系列上一篇文章中我们就说到了,这一次我们要说 pop3 收信了.虽然我觉得应该先说完 mime 格式,不过估计大家已经不耐烦了 -- 怎么老在说发送啊?我们要看收取!    好吧,来啦,来啦!收取邮 ...

  4. 详解CSS display:inline-block的应用

    阅读目录 基础知识 inline-block的问题 inline-block的应用 总结 本文详细描述了display:inline-block的基础知识,产生的问题和解决方法以及其常见的应用场景,加 ...

  5. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  6. 备忘录之 —— .bashrc(IC工具篇)

    好久没有使用这些IC工具了,装在自己的虚拟机中的Linux系统里面,现在想要卸载掉,想起之前自己辛辛苦苦的折腾这些工具配置,如果直接删除,感觉未免有点对不起自己的劳动成果,或许以后再也用不到了,就当是 ...

  7. nginx的location优先级

    在nginx配置文件中,location主要有这几种形式: 1. 正则匹配 location ~ /abc { } 2. 不区分大小写的正则匹配 location ~* /abc { } 3. 匹配路 ...

  8. Go学习笔记03-附录

    第三部分 附录 A. 工具 1. 工具集 1.1 go build gcflags ldflags 更多参数: go tool 6g -h 或 [https://golang.org/cmd/gc/] ...

  9. [转载]LVS+Keepalived之三大模式

    LVS + Keepalived之三大模式 ============================================================================== ...

  10. org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Users/lonecloud/tomcat/apache-tomcat-7.0.70 2/webapps/myproject/WEB-INF/classes/cn/lone

    解决这个报错的解决办法: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidat ...