首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET单元测试艺术-2.核心技术

二、交互测试-模拟对象   工作单元可能有三种最终结果,目前为止,我们编写过测试只针对前两种:返回值和改变系统状态。现在,我们来了解如何测试第三种最终结果-调用第三方对象。...3.4 使用NSubstitute模拟   如果接口方法返回不为空,如何从实现接口动态伪对象返回一个呢?...,即无论参数是什么,方法应该总是返回一个价值,这样的话测试更容易维护,因此我们可以借助NSub参数配器: [Test] public void Returns_ByDefault_WorksForAnyArgument...,隔离框架中被广泛使用,控制参数处理。   ...需要注意是,这里When方法必须使用Lambda表达式。 3.5 同时使用模拟对象和存根   这里我们一个场景中结合使用两种类型伪对象:一个用作存根,另一个用作模拟对象。

1.7K20

.NET Core系列 :4 测试

本文我们目的是我们构建我们应用程序时候能够进行测试,如何使用XUnit结合你可以通过为你项目添加不同测试用例NSubstitute进行单元测试,同时对整个项目进行集成测试。...,[Theory]属性表示执行相同代码,但是有不同输入参数测试套件。...在上面的例子里,总共使用了三次InlineData特性标识,每次设定不同执行单元测试时,设定会被测试框架赋值到对应测试方法参数里。...这时我们通常需要有一个单元测试模拟类库,一直以来,开发者对 mocking 类库语法简洁性有强烈需求,NSubstitute 试图满足这一需求。...简单明了语法可以让我们将重心放在测试本身,而不是纠缠在测试替代实例创建和配置

3.2K100
您找到你想要的搜索结果了吗?
是的
没有找到

5 分钟 .NET 单元测试极简入门

创建实例时传入一个 IBookRepository 模拟对象作为参数,该模拟对象使用 NSubstitute 构建。...调用 BookService 方法,并使用 FluentAssertions 来验证返回值或异常是否符合预期。 运行所有的测试,并检查是否通过。 步骤 1 创建项目和添加引用很简单,我这里不再详述。...: 我们使用 NSubstitute 构建了一个模拟 _bookRepository; 我们构建了要被测试 BookService 对象 _sut; 我们测试类构造函数中把 _bookRepository...); // 调用参数为 author GetBooksByAuthor 方法,并将返回值赋值给 result 变量 // Assert result.Should().NotBeNull...顾名思义,安排就是准备一些测试数据和设置模拟返回值,执行就是执行 _sut 被测试方法,断言就是根据执行方法拿到结果,判断是否正确,以决定是否通过测试。详情我都写在代码注释里了,请详细阅读。

30750

重温《单元测试艺术》,总结常用知识点

如果一个测试只测试一件事情,测试中应该最多只有一个mock,所有其它伪对象都是stub。如果一个测试有多个mock,这说明你测试多件事情,导致测试过于复杂或脆弱。...前面定义Stub和Mock都使用了Fake-前缀,因为类中避免使用"mock"和"stub",那么这个类对象就可以具有两种行为方式,以后再不同测试中重用。 7....Arg类成为参数配器,用于控制参数处理: _calculator.Add(10, -5); _calculator.Received().Add(10, Arg.Any()); //断言第二个参数时...int类型 _calculator.Received().Add(10, Arg.Is(x => x < 0)); //断言第二个参数小于5 使用参数配器并传入一个function到Returns...可以更好地控制返回值: _calculator.Add(Arg.Any(), Arg.Any()) .Returns(x => (int)x[0] + (int

1.5K31

ILRuntime学习

//TestDelegateMethod, 这个委托类型为有个参数为int方法,注册仅需要注册不同参数搭配即可 appdomain.DelegateManager.RegisterMethodDelegate...; StackObject* ptr_of_this_method; //这个是最后方法返回后esp栈指针,应该返回清理完参数并指向返回值,这里是只需要返回清理完参数即可...; //这里是将栈指针转换成object,如果是基础类型可直接通过ptr->Value和ptr->ValueLow访问到,具体请看ILRuntime实现原理文档 object...,是通过反射方式调用,这个过程中会产生GC Alloc,并且执行效率偏低 使用到地方 热更脚本调用主工程脚本 但需要在主工程中提前做好相应工作 注意事项 一定要记得将CLR绑定注册写在...(提供热更脚本使用) 使用原因 Vector3等Unity常用类型如果不做任何处理,ILRuntime中使用产生较多额外CPU开销和GC Alloc 我们通过类型绑定可以解决这个问题,

1K30

正确调用事件处理程序

不管是刚接触 C# 还是已经具有多年开发经验大部分人觉得事件处理很简单,只需要把事件定义好然后需要时候出发它就可以了。其实这种想法是错误,这里面有很多需要注意问题。...,当在对象触发 demo 事件时并没有关联事件处理程序的话,C# 将会用 null 来表示没有处理程序与该事件相关联,进而将会引发 NullReferenceException 异常。...当有多个线程都调用这个事件是就会出现线程之间相互争夺,举个例子来说就是线程 A 执行到 if (demo!...),当另一个进程注销掉事件处理程序时,注销只是 demo 所绑定处理程序,因此当当前线程执行 handler 时是不会出现 NullReferenceException 异常。...于是 C# 6.0 中微软为我们增加了 null 条件运算符(?.)。null 条件运算符可以安全调用事件处理程序并且使代码清晰明了还简单。

83110

2017年高频率互联网校园招聘面试题

应用程序类加载器( Application ClassLoader )这个类加载器是ClassLoader 中 getSystemClassLoader()方法返回值, 一般称其为系统类加载器, 它负责加载用户类路径...,是安全和幂等,GET一般是对后台数据库信息进行查询 POST表示可能修改变服务器资源请求,一般是对后台数据库进行增、删、改操作 GET请求参数跟在URL后进行传递,请求数据会附在URL...分割URL和传输数据,参数之间以&相连,一般浏览器对 URL 长度会有限制 POST请求,提交数据则放置是HTTP包包体中,用类似Key-Value格式发送一些数据,相对来说,GET请求会把请求参数暴露在...进程隔离性要好于线程 B. 线程资源消耗通常要比进程轻量 C. 不同进程间不会共享逻辑地址空间 D. 同一个进程线程之间共享内存,包括堆和栈 E. 进程间有途径共享大量内存中数据 F....赛马 25马,速度都不同,但每匹马速度都是定。现在只有5条赛道,无法计时,即每赛一场最多只能知道5相对快慢。问最少赛几场可以找出25马中速度最快前3名?

1K20

C#开发人员应该知道13件事情

如果你认为一个对象运行时类型可能比编译时类型更具体,那么你可以使用“is”或“as”运算符。 第二种类型转换引发了一个问题,“为什么操作是开始地方执行,而不是目标数据类型?”...对于公开了工作API代码来说,将异常包含于自定义异常中,是特别有用。异常是方法可见接口一部分,应该与参数返回值一起被控制。可能导致更多异常方法,是不应该被使用在可维护解决方案中。...注意竞逐条件 如果事件在线程之间共享,则有可能在你检查null之后并且调用它之前,另一个线程将删除所有参数 – 就会抛出NullReferenceException异常。...始终采用最合适工具,具有可重复性和尽可能接近用户所经历实际条件情况下,对性能进行经验性测量。 由于CLR优化,有时效率低下代码实际比高效代码运行速度更快。...忽略保存返回值 与结构体不同,类是引用类型,方法可以修改引用对象。然而,不是所有的对象方法都实际修改了引用对象,一些返回一个新对象。

2.2K90

iOS_单元测试三之OCMock使用

methods 2.1、模拟方法返回值 Stubbing methods that return objects 2.2、委托给另一个方法 Stubbing methods that return...values 2.3、委托给一个block Delegating to another method 2.4、委托给块 Delegating to a block 2.5、模拟 通过参数返回值方法 返回值...该Block可以从调用对象中读取参数,并可以设置返回值。...通过参数返回值方法 返回值 Returning values in pass-by-reference arguments 2.5.1、对象参数 通过参数传回: // 模拟 应该返回参数值 NSError...当开发人员尝试为此类创建模拟程序时,将引发异常,解释问题说 该方法单独调用中返回不同是可以接受,这使它在运行时对特定条件做出反应 如果该方法为reason赋值,返回值将被忽略 对于所有未实现此方法

3.1K20

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

仓库持有不同产品库存。订单包含产品和数量。...CallOriginal 某些情况下,您可能希望调用原始方法实现时使用特定调用该方法,并使用其他调用模拟。为此,您可以使用该CallOriginal方法。...Machers 匹配器让你忽略传递实际作为模拟中使用参数。相反,它们给你传递一个满足参数类型或期望范围表达式可能性。...这抛出了一个模拟异常。请记住,这只会在您使用StrictBehavior创建模拟时才起作用。 另一个常用技巧是断言将属性设置为特定引发异常。...活动 该方法Raises允许您在调用方法时引发事件并传递特定事件参数。回到我们仓库示例,我们可能想要在调用ProductRemoved该Remove方法时引发事件。

1.1K70

【C++STL】vector(常见接口、模拟实现、迭代器失效)

find find使用需要包 头文件 注意上面if语句判断条件,找不到时,返回值是自己给last,即上面的v.end()。...如下图: 模拟实现 尾插 上方是错误模拟。因为_start已经改变了,_finish-_start就不是原本空间大小了。...,当我们想插入10个1构造时,优先跟函数1配,因为他是模板, 而函数2形参类型有size_t ,因此匹配度没模板好。...要解决这个问题就得insert形参里面传引用,但是这会引发别的问题,库里面没有去解决这个问题,所以不要使用。 上方删除偶数操作也是导致迭代器失效。...模拟实现erase也要跟着修改 ,要有返回值,如下图: 使用memcpy拷贝问题 当不需要扩容时,可以正常运行。 如果扩容了,程序就崩了。问题出在memcpy

10210

译 | 你到底有多精通 C# ?

使用一个空对象(例如,一个null对象上调用方法,或访问它一个属性)导致 NullReferenceException ,例如: object nullValue = null; bool areNullValuesEqual...重载方法中 null 转到其他话题之前,让我们仔细了解调用参数数量相同但类型不同重载方法时如何处理空。...还是代码因为方法调用不明确而无法编译? 在这种情况下,代码可以编译,并调用具有字符串参数方法。...通常,当一个参数类型可以转换成一个参数类型 (即一个参数类型从另一个参数类型派生) 时,代码可以编译。将调用具有更具体参数类型方法。 当这两种类型之间不可以转换时,代码将不会编译。...不幸是,不对。 类静态构造函数只调用一次。如果它引发异常,则每当您要创建实例或以任何其他方式访问类时,都将重新引发此异常。 重新启动进程 (或应用程序域) 之前,该类实际无法使用。

82040

Mockito框架Mock Void方法

Mockito是用于编写单元测试最著名模拟框架之一。 为什么模拟void方法 假设我们有一个方法A,在此方法中,使用了另一个void方法B。...但是,在此测试用例中,我们唯一需要验证是使用正确参数集调用了userRepository中updateName()方法。为此,我们需要模拟updateName()方法,捕获参数并验证参数。...这里要注意最重要是,我们不能仅仅使用Mockito==when-then==机制来模拟void方法。因为,Mockitowhen()方法适用于返回值,而方法返回值是void时则不适用。...如何在Mockito中模拟void方法 Mockito中,我们可以使用不同方法来调用实例方法或模拟void方法。...测试用例中,对于模拟对象每种方法,doNothing是默认行为。因此,如果不想验证参数,则使用doNothing是完全可以

8.9K31

小谈C#异常

,但是该文件可能不存在,在这种情况下引发异常。...NET异常 以下是常见.NET异常列表: System.NullReferenceException 这时最常见异常,当我们尝试调用方法、属性、索引器等时,就有可能抛出此异常。...如果没有任何,则它将返回该类型默认。由于Person是引用类型,因此其返回值为null。然后我们调用name,这时就会依引发空引用异常。...System.IO.IOException 这个异常是IO操作期间发生引发。与前两个异常不同,我们可能不时捕捉或抛出它。...SQL Server 返回错误或警告时将引发这个异常。SqlException类具有一个称为Errors属性,该属性是一个包含SqlError该类一个或多个实例集合。

88810

C#基础篇 - 理解委托和事件

自定义委托 声明和执行一个自定义委托,大致可以通过如下步骤完成: 利用关键字delegate声明一个委托类型,它必须具有和你想要传递方法具有相同参数返回值类型; 创建委托对象,并且将你想要传递方法作为参数传递给委托对象...调用多路广播委托时,将按照调用列表中委托出现顺序来同步调用这些委托。如果在该列表执行过程中发生错误,则会引发异常。(--摘自MSDN) Q:为什么使用“+=”号就能实现绑定呢?...Q:多播委托能引用多个具有返回值方法吗? 答案是,当然能。委托方法可以是无返回值,也可以是有返回值。不过,对于有返回值方法需要我们从委托列表上手动调用。...: Action委托:允许封装方法有多个参数,不能有返回值; Func委托:允许封装方法有多个参数,必须有返回值; Predicate委托:允许封装方法有一个参数返回值必须为bool...总结上面事件使用几个步骤: 用event关键字定义事件,事件必须要依赖一个委托类型; 类内部定义触发事件方法; 类外部注册事件并引发事件。

49830

【STL】iterator adapters_反向迭代器实现

放在专栏【C++知识总结】,持续更新,期待支持  本章相关文章: 【STL】容器适配器 【STL】list模拟实现 【STL】vector模拟实现 1、反向迭代器介绍 1.1、前言 在前文中我们已经讲过...STL中配器概念,即在底层将一个类接口转化为另一个接口,并根据此设计模式模拟实现了stack与queue。...既然作为一种适配器模式,反向迭代器实现肯定离不开正向迭代器,事实也确实如此,反向迭代器操作实际底层都调用是正向迭代器与之对应接口。...2、模拟实现 这里由于库中实现较为复杂,涉及到一些操作实现(萃取等)起来较为难以理解,在这里我们只是简单对其实现即可。同时我们对其实现完成后,我们可以将其用在不同支持反向遍历容器中使用。...,取其返回值地址即可: 2.1.5、==与!

17420

C#7.0 新增功能

03 弃元 通常,进行元组解构或使用 out 参数调用方法时,必须定义一个其无关紧要且你不打算使用变量。 为处理此情况,C# 增添了对弃元支持 。...分配返回值时省略 ref 修饰符表示调用方需要该副本,而不是对存储引用。 不可向 ref 本地变量赋予标准方法返回值。...向返回值添加 ref 是源兼容更改。 现有代码进行编译,但在分配时复制 ref 返回值。调用方必须将存储返回值更新为 ref 局部变量,从而将返回值存储为引用。...,以确保异步工作开始之前引发参数验证引起异常: 1 public Task PerformLongRunningWork(string address, int index,...C# 7.0 扩展了可作为表达式实现允许成员。 C# 7.0 中,你可以属性 和索引器 实现构造函数 、终结器 以及 get 和 set 访问器。

1.3K10

【STL】容器适配器

放在专栏【C++知识总结】,持续更新,期待支持 1、什么是适配器?...adapter这个概念实际是一种设计模式:将一个class接口转化为另一个class接口,使原本因接口不兼容而不能合作classes可以一起合作。...具有这种将一个类接口转化成客户想要另一个接口性质,我们称之为适配器(配接器)。...、queue 2.3.1、queue介绍 queue也是默认以deque作为其底层容器,我们平常在使用时,直接传一个模板参数T即可,当然我们也可以修改其底层容器,不过要作为queue底层容器,必须要具有以下几个接口...,而deque由于其中控器中存储都是一个个指针,因此扩容时,仅仅只需要将其数组指针进行拷贝,这里就不存在深拷贝问题,因为指针是内置类型,内置类型拷贝时是拷贝(浅),因此deque扩容要比vector

21810

可空类型

如果没有检查变量或者检查错了对象怎么样呢?即使这样也无须担忧,因为当HasValue为false时,任何访问maxPriceFilter操作都会引发异常。...可以执行从T到Nullable隐式类型转换。该转换总是返回对应可空,并且其HasValue为true。该隐式转换等同于调用带参数构造器。...该行为或多或少影响效率,但是还不至于造成困扰。如果对可空类型调用GetType(),要么引发NullReferenceException,要么返回对应非可空类型,如代码清单2-10所示。...x; int32 x; 上述4种写法任意组合、混用都没有问题,它们产生IL代码没有任何区别。实际编码中,我一贯使用?写法,不过不同团队或许有不同编码习惯。由于?...下面介绍另一个可以应用于可空类型运算符,其行为更符合我们直观预期:只需要把null引用行为照搬到null即可。

2.2K30

60道硬核 Python 面试题,论面霸是如何炼成

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式函数。 lambda 函数不能包含命令,它们所包含表达式不能超过一个。...Python异常处理用法和作用 执行try下语句,如果引发异常,则执行过程跳到except语句。对每个except分支顺序尝试执行,如果引发异常与except中异常组匹配,执行相应语句。...它使框架变得轻盈,只是少量依赖于更新和更少安全性错误。 会话基本允许您记住从一个请求到另一个请求信息。flask中,会话使用签名cookie,以便用户可以查看会话内容并进行修改。...以下代码可以支持SMTP监听器服务器执行。...箱子再运到B手中时,B取下自己锁,获得药物。 60. 有25马,速度都不同,但每匹马速度都是定。现在只有5条赛道,无法计时,即每赛一场最多只能知道5相对快慢。

1.8K70
领券