最近在使用ASP.NET Core的时候出现了一个奇怪的问题。在一个Controller上使用了一个ActionFilter之后经常出现EF报错。...(ActionExecutingContext context, ActionExecutionDelegate next); // public virtual void...(ActionExecutingContext context, ActionExecutionDelegate next) { if (!...其中注入的service里面的方法是异步的,尽管标记了await,但是这并没有什么卵用,因为框架在调用OnActionExecuting的时候并不会在前面加上await来等待这个方法。...如果同步版本跟异步版本的方法都同时实现了,则只会调用异步版本的方法。当使用抽象类,比如ActionFilterAttribute,只需重写同步方法或者异步方法其中一个。
2准备进行单元测试 创建单元测试项目并执行测试应该依据一定的准则,运用一些技巧或工具,下面列举了常用的技巧和工具。 命名规则 测试类应以被测试的单元命名,测试方法的名称应能够描述待验证的行为。...有两种方式模拟依赖:一种是创建模拟对象,另一种是使用框架。为能够模拟依赖,使用存储库模式。 例1:自定义模拟对象。...Moq 使用nuget下载Moq,截图如下: ?...要测试过滤器,就要模拟HTTP上下文、请求等。此外,建议将具体的验证逻辑代码封装起来,这样可以将其作为普通的类来测试。...我们常见的相关概念是控制反转(依赖注入) 使用IoC框架 使用成熟稳定的Ioc框架减少待测试的代码量,减轻测试任务量。
第 7 章 高级主题 7.2 并发 当两个用户获取同一个资源后,再同时修改该资源,就会导致并发问题 常见实现并发的方法有以下两种: 保守式并发控制,每次修改资源,都锁定资源 开放式并发控制,每次修改资源...(ActionExecutingContext context, ActionExecutionDelegate next) { if (!...(context, next); } } } 接着在 BookController 的 UpdateBookAsync 和 PartiallyUpdateBookAsync 两个方法应用该特性...: 使用 [ApiVersion] 特性 使用版本约定特性 ASP.NET Core MVC 默认的方式是使用查询字符串,参数名为 api-version 添加nuget Install-Package...先前的版本不需要时,可以将 Deprecated 属性设置为 true [ApiVersion("1.0", Deprecated = true)] 除了特性外,ASP.NET Core MVC 还支持使用约定的方式来指定
最早版本所有的Controller Action 都是同步请求, 来一个请求同步查询数据, 执行HTTP请求等等都是正常的逻辑代码. 从来不用async/awati之类的东西....return Ok(new { data = await _bookService.FindBookDetailForUser(id), code = 0 }); } service层的用到的方法同时也改造成异步...这次发布最大变更是IP定位, 需要处理headers中的IP数据, 使用ActionFilterAttribute在请求进入Action方法前完成IP到地区的转换....maxMindDBClient = maxMindDBClient; _redisService = redisService; } public override async Task OnActionExecutionAsync...(ActionExecutingContext context, ActionExecutionDelegate next) { var dicXHeaders = new Dictionary
第 5 章 使用 Entity Framework Core 5.4 重构 Controller 和 Action 重构 AuthorController 构造函数重构 public IMapper Mapper...Mapper.Map 时才实际去执行查询,获取单个资源的方法的重构思路类似 创建资源方法重构 [HttpPost] public async Task CreateAuthorAsync...{ RepositoryWrapper = repositoryWrapper; } public override async Task OnActionExecutionAsync...(ActionExecutingContext context, ActionExecutionDelegate next) { var authorIdParameter...{ context.Result = new NotFoundResult(); } await base.OnActionExecutionAsync
(提示: 如果需要指向多个目标框架的话可以使用TargetFrameworks元素, 注意多了个s) 看一下Program.cs: ? Main方法是程序的入口....在Configure方法里, 配置应该遵循Add/Use的风格样式, 首先定义需要什么, 然后定义如何使用它....需要注意的是, Run方法和Use方法定义的顺序非常重要, 运行时将会精确的按照创建的顺序来执行....(ActionExecutingContext context, ActionExecutionDelegate next) { OnActionExecuting...(ActionExecutingContext context, ActionExecutionDelegate next) { OnActionExecuting
前言 模拟库在软件开发和测试过程中起着非常重要的作用,特别是在单元测试中。今天大姚给大家分享一个.NET开源、流行、使用简单的模拟库:Moq,助力简化单元测试!...Moq类库介绍 Moq是一个.NET开源、流行、使用简单的模拟库,充分利用了.NET 的 Linq 表达式树和 lambda 表达式。这使得 Moq 成为最具生产力、类型安全且支持重构的模拟库。...创建控制台应用 首先我们创建一个名为:MoqExercise 的.NET 8控制台应用: 安装Moq NuGet 创建模拟对象 以下是一个简单的示例,展示如何使用 Moq 来快速创建 IUserInfo...Moq框架提供了Verify方法,帮助开发者可以轻松地验证这些方面。...; } 模拟抛出异常 在单元测试中使用 Moq 框架时,可以模拟接口的方法抛出异常。
前言 今天大姚给大家推荐一个.NET开源、流行、使用简单的.NET模拟库:Moq。...Moq类库介绍 Moq是一个.NET开源、流行、使用简单的 .NET 模拟库,充分利用了.NET 的 Linq 表达式树和 lambda 表达式。...创建控制台应用 首先我们创建一个名为:MoqExercise 的.NET 8控制台应用: 安装Moq NuGet 创建模拟对象 以下是一个简单的示例,展示如何使用 Moq 来快速创建 IUserInfo...Moq框架提供了Verify方法,帮助开发者可以轻松地验证这些方面。...; } 模拟抛出异常 在单元测试中使用 Moq 框架时,可以模拟接口的方法抛出异常。
Moq类库介绍 Moq是一个.NET开源、流行、使用简单的 .NET 模拟库,充分利用了.NET 的 Linq 表达式树和 lambda 表达式。...从而简化单元测试中的依赖管理和验证过程,提高代码的可测试性和可维护性。...创建控制台应用 首先我们创建一个名为:MoqExercise 的.NET 8控制台应用: 安装Moq NuGet 创建模拟对象 以下是一个简单的示例,展示如何使用 Moq 来快速创建 IUserInfo...Moq框架提供了Verify方法,帮助开发者可以轻松地验证这些方面。...; } 模拟抛出异常 在单元测试中使用 Moq 框架时,可以模拟接口的方法抛出异常。
可以看到,执行顺序和开篇的第一张图例一致,首先执行时资源过滤器的 OnResourceExecuting 方法,接着请求接入了 操作过滤器的 OnActionExecuting 方法,最后执行操作过滤器的...after)介入功能,可以使用该过滤器对进入 API 的参数和结果进行干预 结果过滤器:这个过滤器的作用和操作过滤器非常相似,主要其作用范围是有微小区别的,结果过滤器是在操作即将返回结果到客户端之前(before...virtual Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next);...,那么 OnActionExecutionAsync 这个异步方法不应该和 执行前(before)执行后(after)同时共存 同样,写入结果前(before)写入后(after)和 OnResultExecutionAsync...IResourceFilter 异常过滤器 IExceptionFilter 操作过滤器 ActionFilterAttribute 结果过滤器 IResultFilter 还通过一些简单说实例演示了过滤器的执行过程 最后介绍了如何在过滤器中使用中间件
而针对隔离测试, 并不应该使用生产时用的依赖项, 所以我们使用模拟版本的依赖项, 这些模拟版依赖项只能用于测试时, 它们会使隔离更加容易....单元测试 Mock技术通常在单元测试中使用, 可以使用xUnit来为.NET Core应用做单元测试, 这里有介绍xUnit的文章: https://www.cnblogs.com/cgzl/p/9178672...它可以使用很直接的方式模拟依赖项的行为....对于Stub 和 Mock ,可以看下面两张图例: Moq 官网: https://github.com/moq/moq4 Moq框架可以用来创建dummy, stub 和 mock....Moq使用一套API来创建stub和mock对象.
而针对隔离测试, 并不应该使用生产时用的依赖项, 所以我们使用模拟版本的依赖项, 这些模拟版依赖项只能用于测试时, 它们会使隔离更加容易. ?...单元测试 Mock技术通常在单元测试中使用, 可以使用xUnit来为.NET Core应用做单元测试, 这里有介绍xUnit的文章: https://www.cnblogs.com/cgzl/p/9178672...Moq 官网: https://github.com/moq/moq4 Moq框架可以用来创建dummy, stub 和 mock. 在本文里把这三个东西都叫做mock对象吧....Moq使用一套API来创建stub和mock对象....所以, 我们需要Moq, 它可以提供一个Mock(模拟)版本的IPhysicalExamination, 并把它传递到审批类的构造函数里. 安装Moq 在单元测试项目添加Moq: ?
以下是一些关键特点和概念,来介绍 JUnit: 注解和断言: JUnit 使用注解(如 @Test)来标识测试方法,并使用断言(如 assertEquals)来验证代码的行为是否符合预期。...配置 NUnit 运行器: NUnit 框架通常使用一个运行器(runner)来执行测试。配置 NUnit 运行器的方法取决于你的环境和偏好。...2.2 模拟和存根 在 NUnit 中,你可以使用模拟(Mocks)和存根(Stubs)来模拟外部依赖或虚拟对象的行为,以便在单元测试中隔离被测代码并确保其正常运行。...通常,你可以使用第三方库,如 Moq、NSubstitute 或 Rhino Mocks,来创建模拟和存根对象。以下是使用 Moq 作为示例的步骤: 1....使用模拟和存根有助于隔离被测代码,使测试更加独立和可重复。这种方法允许你测试代码的特定行为,而不依赖于外部依赖的状态。确保在项目中使用适当的存根和模拟,以提高测试的质量和可维护性。
本教程将通过对”鹦鹉学舌”插件对”如何测试与调试Newbe.Mahua”. 测试 测试分类多种多样,其中,”单元测试”是最开始的细粒度测试。...掌握单元测试的技能,将会在使用Newbe.Mahua进行开发时无往不利的成功秘诀。 本教程将使用VS2017作为开发IDE进行演示。 新建测试项目 ?...引入测试框架 .Net测试框架众多,主流的有MSTest、NUnit和XUnit。本教程选择XUnit进行演示。...的参数,确定在整个单元测试结束之后,所有被模拟的方法都已经被执行。...因此,要增加额外的逻辑判断和单元测试,来确保这个BUG不会发生。真正的勇士,自己就会动手。 最后 单元测试就是为了确保代码逻辑在小范围内绝对正确的开发行为,很有必要。
上一章介绍了手动创建单元测试依赖,和Moq的小demo 这一章我们看一下Moq的使用。...---- 不过,at the vary beginning,我想再和大家确认两个概念问题——Stub(存根)和Mock(模拟) Stub和Mock都是测试方法依赖隔离的伪造对象,不同之处是Stub是测试方法运行所需要的依赖...请注意这里的Mock和Moq框架中的Mock不是一个概念!! 这也是Moq框架被众多开发人员诟病的一点。 这时有读者会问了,讲这么多概念,头都晕了,但是对我写单元测试没有一点用呀。...这个是同时Stub和Mock了同一个方法。非常正确,但是无用。 关键是这种写法出现在了我们团队真实的单元测试代码中。。。...名不正,则言不顺;言不顺,则事不成理论不清晰的行动,总是不能在长期的战斗中获胜 在单元测试框架中,(尤其是Moq这种概念不清楚的),时刻清除你的伪对象在做什么,是非常重要的一点 ---- 本文会经常更新
1.3 使用Moq进行模拟和依赖注入 模拟对象 在进行单元测试时,使用 Moq 进行对象模拟是一种常见的做法,特别是在测试依赖注入的情况下。Moq 可以帮助你模拟接口或虚方法,以便更容易地进行测试。...我们可以使用 Moq 来模拟 IDataService 接口,并验证调用。...通过使用 Moq,我们可以轻松地创建模拟对象,并对其行为进行验证,从而编写出更具可靠性和可维护性的单元测试。...下面介绍一些常见的依赖注入的测试替代品: 模拟对象(Mock Objects):Mock 对象是使用一些测试框架(比如 Moq)来模拟依赖对象的一种方式。...我们将使用 Moq 来模拟 IUserService 接口,并验证 GetUser 方法的行为。
单元测试 对于单元测试,我将使用 xUnit 测试框架。在 .NET Core 中,您可以使用 dotnet new xunit 命令添加一个测试项目。...一个显而易见的问题是模拟和验证动态参数,例如,假设您想验证一个方法调用是否具有动态属性。...Moq 库中的 C# 泛型来模拟 IMessageBus,然后使用 Object 属性创建一个模拟实例。...是时候为 ExpandoObject 类型编写一个漂亮的单元测试了。使用 xUnit 作为测试框架,您将看到带有 Fact 属性的方法。...Moq: 模拟库 Xunit: 测试框架 总结 C# 动态类型或许看起来令人望而生畏,但它在强类型系统之上有很多好处。
单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。...今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试有所了解,比如如何mock一个接口。...下面看看如何对这个Action进行测试。...ASP.NET Core框架进行登录认证的时候,往往使用HttpContext.SignInAsync进行认证授权,所以单元测试的时候也需要进行mock。...下面演示下如何对Fitler进行测试。
本文的示例代码没有使用最近有争议的 Moq 库,而是使用了 NSubstitute 代替。...如何构建测试项目 单元测试是一种验证代码功能正确性的方法,它可以使用一些特定的框架和工具来编写和运行。...在这个例子中,我们使用了 xUnit、NSubstitiue 和 FluentAssertions 这 3 个库来进行单元测试。...xUnit 是一个流行的 .NET 单元测试框架,它提供了一些特性和约定来编写和组织测试用例。...使用 NSubstitiue 来配置模拟对象的行为,例如返回一些预设的数据或抛出一些异常。
领取专属 10元无门槛券
手把手带您无忧上云