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

使用NSubstitute验证单元测试中的Expression<Func<T、bool>>参数

在单元测试中,我们经常需要验证传递给方法的参数是否符合预期。当参数是一个 Expression<Func<T, bool>> 类型时,我们可以使用 NSubstitute 来进行验证。

NSubstitute 是一个用于创建和替代 .NET 对象的库,它提供了一套简洁而强大的 API,用于设置对象的行为和验证方法的调用。

要验证 Expression<Func<T, bool>> 参数,我们可以使用 NSubstitute 的 Arg.Is 方法来匹配传递给方法的参数。Arg.Is 方法接受一个谓词委托,用于判断参数是否符合预期。

下面是一个示例,演示了如何使用 NSubstitute 验证 Expression<Func<T, bool>> 参数:

代码语言:txt
复制
// 假设我们有一个名为 repository 的接口,其中有一个方法 GetByCondition,接受一个 Expression<Func<T, bool>> 参数
public interface IRepository<T>
{
    T GetByCondition(Expression<Func<T, bool>> condition);
}

// 创建一个替代的 repository 对象
var repository = Substitute.For<IRepository<User>>();

// 设置 repository.GetByCondition 方法的行为
repository.GetByCondition(Arg.Is<Expression<Func<User, bool>>>(condition => condition.Compile()(new User { Age = 18 })))
    .Returns(new User { Name = "John" });

// 调用被测试的方法
var result = repository.GetByCondition(u => u.Age == 18);

// 验证方法的调用
repository.Received().GetByCondition(Arg.Is<Expression<Func<User, bool>>>(condition => condition.Compile()(new User { Age = 18 })));

// 验证返回值
Assert.AreEqual("John", result.Name);

在上面的示例中,我们首先创建了一个替代的 IRepository<User> 对象。然后,我们使用 Arg.Is 方法来设置 GetByCondition 方法的行为,该行为会判断传递给方法的参数是否符合预期,并返回一个指定的结果。

接下来,我们调用被测试的方法,并使用 Received 方法来验证 GetByCondition 方法是否被调用,并传递了符合预期的参数。

最后,我们使用断言来验证返回的结果是否符合预期。

总结一下,使用 NSubstitute 验证 Expression<Func<T, bool>> 参数时,我们可以使用 Arg.Is 方法来匹配参数,并使用 Received 方法来验证方法的调用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

下图展示了存根和模拟对象之间区别,可以看到测试会使用模拟对象验证测试是否失败。 ?...2.2 第一个手工模拟对象   创建和使用模拟对象方法与使用存根类似,只是模拟对象比存根多做一件事:它保存通讯历史记录,这些记录之后用于预期(Expection)验证。   ...它提供最经常需要使用测试功能,且易于使用,语句更符合自然语言,可读性更高。对于单元测试新手或只专注于测试开发人员,它具有简单、友好语法,使用更少lambda表达式来编写完美的测试程序。   ...,在隔离框架中被广泛使用,控制参数处理。   ...(1)Roy Osherove 著,金迎 译,《单元测试艺术(第2版)》   (2)匠心十年,《NSubsititue完全手册》   (3)张善友,《单元测试模拟框架:NSubstitute》 作者:

1.7K20
  • .NET框架设计(常被忽视C#设计技巧)

    ;),所以何不使用简单方便委托调用呢; 注:如果你是初学者,这里委托可以理解成是我们平时常用Lambda表达式,也可以将它与Expression结合起来使用Expression是委托在运行时数据结构...;为了保证上面的代码是绝对正确,以免程序错误造成阅读者不爽,所以都会有100%单元测试覆盖率;这里我们主要使用是Order类SumPrices方法,所以它UnitTest是100%覆盖;...Lambda方式将逻辑直接注入进BusinessService,好就好这里;可以将Lambda封进Expression然后直接存储在Cache或者配置中间,彻底告别反射调用吧,就好比委托一样没有人会在使用委托在定义个没用方法...我们继续使用上面2】小结代码作为本节演示代码,现在我们假设需要在DomainModelEntity上面加上两个特性第一个用来断定它是否需要做Cache,第二个用来确定关于Entity操作验证特性...本身没有直接关系,换句话说我们这里Order聚合实体可能需要一个获取Order在Cache存活了多长时间方法;那么在以往我们可能提供一个方法然后把Order实例作为参数这样来使用,但是这里我们需求是该方法是

    2K71

    .NET Core系列 :4 测试

    本文我们目的是在我们构建我们应用程序时候能够进行测试,如何使用XUnit结合你可以通过为你项目添加不同测试用例NSubstitute进行单元测试,同时对整个项目进行集成测试。...,[Theory]属性表示执行相同代码,但是有不同输入参数测试套件。...在上面的例子里,总共使用了三次InlineData特性标识,每次设定值都不同,在执行单元测试时,设定值会被测试框架赋值到对应测试方法参数里。...它们如同单元测试一样快速简单,但最重要是,它们允许你在整个请求管道测试 ASP.NET 应用,而不只是控制器类孤立方法。...建议尽可能编写单元测试,并针对无法单元测试行为退回到集成测试,但使用此类高性能方式在 ASP.NET Core 运行集成测试是非常棒

    3.2K100

    只要十步,你就可以应用表达式树来优化动态调用

    我们将使用一个具体场景来逐步使用表达式来实现动态调用。 在该场景,我们将构建一个模型验证器,这非常类似于 aspnet mvc ModelState 需求场景。...首先需要确认事情有两个: 使用表达式树取代反射是否有更好性能? 使用表达式树进行动态调用是否有很大性能损失? 有问题,做实验。我们采用两个单元测试验证以上两个问题。...: 增加了一个单元测试初始化方法,在单元测试启动时创建一个表达式树将其编译为委托保存在静态字段 _func 。...那么我们只要使用类似于 Init 构建过程来构建表达式和委托即可。 开发者可以试着为 ValidateCore 增加第三个参数 name 以便拼接在错误信息,从而了解如果构建这种简单表达式。...Expression.Parameter 用于标明委托表达式参数部分。 Expression.Variable 用于标明一个变量,就是一个普通变量。类似于代码 var a。

    59930

    .NET重构—单元测试代码重构

    阅读目录: 1.开篇介绍 2.单元测试、测试用例代码重复问题(大量使用重复Mock对象及测试数据) 2.1.单元测试继承体系(利用超类来减少Mock对象使用) 2.1.1.公用MOCK对象;...大量使用重复Mock对象及测试数据) 单元测试代码中最常见代码就是Mock或者Fake接口逻辑,那么在一个具有上百个用例覆盖代码中会同时使用到一组相关Mock接口对象,这无形增加了我们编写单元测试效率给后期维护测试用例带来了很大隐患及工作量...; 2.1】单元测试继承体系(利用超类来减少Mock对象使用) 将多个相关测试用例代码通过超类方式关联起来统一管理将大大减少重复代码构建;就跟我们重构普通代码一样,将多个类之间共享逻辑代码或者对象提取出来放到基类...Provider中都能在LINQ中找到了合适使用之地;比如在对远程Service进行LINQ设计时候,我们都是按照这样方式进行编写,但是就怕LINQ带有逻辑判断表达式,这个时候就会在单元测试总是无法覆盖到情况出现...;其实如果想最大化建立领域测试框架有必要开发一套专门领域测试工具,它能够实时读取真实数据进行Assert,也就更加接近自动化测试; 但是单元测试也不需要对真实数据进行验证,真实数据一般是集成测试时候使用

    1.3K60

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

    在我编写单元测试时,我会对代码更有信心。在已测试代码更易于添加功能或修复 Bug,因为在代码发生更改时,单元测试起着安全网作用。 前几个月重温了单元测试艺术。...选择单元测试框架 《单元测试艺术》书中推荐NUnit,VS2019新建单元测试项目只有MSTest V2、NUnit和xUnit三种。...6.2 Mock(模拟对象) 模拟对象(Mock)是系统伪对象,它可以验证被测试对象是否按照预期方式调用了这个伪对象,因此导致单元测试通过或者失败。通常每个测试最多有一个模拟对象。...前面定义Stub和Mock都使用了Fake-前缀,因为在类避免使用"mock"和"stub",那么这个类对象就可以具有两种行为方式,以后再不同测试重用。 7.....NET隔离框架有很多,《单元测试艺术》书中以NSubstitute(简称NSub)为例介绍了隔离框架基本用法(看起来最近nuget下载量比moq更多)。

    1.5K31

    yii2 在控制器验证请求参数使用方法

    写api接口时一般会在控制器简单验证参数正确性。 使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。 针对每个请求单独写个Model , 定义验证规则并进行验证。...缺点:写好多参数验证Model 类。 使用独立验证器 中提到$validator- validateValue() 方法直接验证变量值。缺点:写实例化很多验证器对象。...从验证规则获取可赋值属性。 <?...使用参数验证模型 进行验证和存储验证错误消息。 使用魔术方法获取参数验证模型 验证错误消息。 <?...在控制器验证请求参数使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

    4.5K10

    yii2 在控制器验证请求参数使用方法

    写api接口时一般会在控制器简单验证参数正确性。 使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。 针对每个请求单独写个Model , 定义验证规则并进行验证。...缺点:写好多参数验证Model 类。 使用独立验证器 中提到$validator- validateValue() 方法直接验证变量值。缺点:写实例化很多验证器对象。...有么有“一劳永逸”做法,像在Model 通过rules 方法定义验证规则并实现快速验证呢?有!...从验证规则获取可赋值属性。 <?...使用参数验证模型 进行验证和存储验证错误消息。 使用魔术方法获取参数验证模型 验证错误消息。 <?

    3.7K00

    产品说,我只需要一个有亿点复杂查询界面

    本文我们将通过几个简短示例来了解如何完成这些操作。 你也可能接到过这些需求 今天我们看看表达式树如何实现这些需求。 一切都还要从盘古开天开始说起 以下是一个简单单元测试用例。...x < maxValue; } } 有一天盘古突然醒了但天还没亮 那可以使用 minValue 和 maxValue 作为参数来制作工厂方法,那么用委托当然也可以。...不过稍微有点不同是,表达式合并需要用 Expression 类型相关方法创建。...避免对左右表达式直接调用。 使用一个叫做 Unwrap 方法,可以将 Lambda Expression 解构成只包含 Body 部分表达式。...通过外部参数来决定。就基本完成了一个多 And 值比较查询条件动态构建。

    18420

    Golang 单元测试 - 逻辑层

    前面我们完成了最麻烦数据层单元测试,今天我们来看看单元测试中最容易做一层,数据逻辑层,也就是我们通常说 service 或者 biz 等,是描述具体业务逻辑地方,这一层包含我们业务最重要逻辑...Golang 提供了 github.com/golang/mock 来实现 mock 接口操作,本文就是使用它来完成我们单元测试。.../mock/user_mock.go -package=mock 参数名称都很好理解,我这边不赘述了。命令执行完成之后,会在 destination 生成对于 mock 接口,就可以使用了。...err) } func TestUserService_GetUser(t *testing.T) { ctl := gomock.NewController(t) defer ctl.Finish...err) assert.Equal(t, username, userInfo.Username) } 与之前一样,我们依旧使用 github.com/stretchr/testify 做断言来验证最终结果

    48210

    手把手教你如何进行 Golang 单元测试

    本篇不准备大而全谈论单元测试、笼统介绍 Golang 单测工具,而将从 Golang 单测使用场景出发,以最简单且实际例子讲解如何进行单测,最终由浅入深探讨 go 单元测试两个比较细节问题...dao 层负责数据操作,主要是数据库或持久化存储相关操作 因此,从职责出发来看,在做后台单测,核心主要是验证 service 层和 dao 层相关逻辑,此外 controller 层参数校验也在单测之中...Golang 单测工具选型 由于我们把单测简单分为了两种: 对于无第三方依赖纯逻辑代码,我们只需要验证相关逻辑即可,这里只需要使用 assert (断言),通过控制输入输出比对结果即可。...关于 mock 工具同时使用 gomock 和 gomonkey,这里跟 Golang 语言特性有关,下面会详细说明。 完善测试用例 这里我们开始对示例代码函数做单元测试。... 打桩 断言 这里面同时使用了 gomock、gomonkey 和 testify 三个包作为压测工具,日常使用,由于复杂调用逻辑带来繁杂单测,也无外乎使用这三个包协同完成。

    1.4K31
    领券