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

使用It.Is而不是It.IsAny在Verify上抛出NullReferenceException

是因为It.Is用于指定参数的具体值,而It.IsAny用于指定参数的任意值。当在Verify方法中使用It.IsAny时,它将匹配任何传递给该参数的值,包括null。因此,如果在Verify方法中使用It.IsAny,并且该参数的值为null,就会抛出NullReferenceException异常。

相反,使用It.Is可以指定参数的具体值,从而避免了NullReferenceException异常的发生。通过使用It.Is,我们可以对参数进行更精确的匹配,以确保在验证过程中不会出现意外的异常。

举个例子,假设我们有一个名为userService的服务,其中有一个方法DeleteUser,该方法接受一个名为user的参数。我们想要验证DeleteUser方法是否被调用,并且传递的user参数为null。我们可以使用以下代码进行验证:

代码语言:txt
复制
// 假设userService是一个模拟对象
Mock<IUserService> userServiceMock = new Mock<IUserService>();

// 调用被测试的代码,假设调用了DeleteUser方法并传递了null参数
userServiceMock.Object.DeleteUser(null);

// 使用It.Is来指定参数的具体值
userServiceMock.Verify(x => x.DeleteUser(It.Is<User>(u => u == null)));

在上面的代码中,我们使用了It.Is来指定参数的具体值为null。这样,当DeleteUser方法被调用时,我们可以确保传递的参数为null,而不会抛出NullReferenceException异常。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供可扩展的计算容量,支持多种操作系统,适用于各种应用场景。详情请参考:云服务器(CVM)
  • 云数据库 MySQL 版:提供高性能、可扩展的 MySQL 数据库服务,支持自动备份、容灾等功能。详情请参考:云数据库 MySQL 版
  • 人工智能平台(AI Lab):提供丰富的人工智能开发工具和服务,包括图像识别、语音识别、自然语言处理等。详情请参考:人工智能平台(AI Lab)
  • 物联网套件(IoT Suite):提供全面的物联网解决方案,包括设备接入、数据管理、应用开发等功能。详情请参考:物联网套件(IoT Suite)
  • 腾讯云区块链服务(Tencent Blockchain):提供安全、高效的区块链解决方案,支持智能合约、跨链互操作等功能。详情请参考:腾讯云区块链服务(Tencent Blockchain)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么我 Linux 使用 exa 不是 ls?

我们生活在一个繁忙的世界里,当我们需要查找文件和数据时,使用 ls 命令可以节省时间和精力。但如果不经过大量调整,默认的 ls 输出并不十分舒心。...这个工具是用 Rust 编写的,该语言以并行性和安全性闻名。...它使用颜色来区分文件类型和元数据。它能识别符号链接、扩展属性和 Git。而且它体积小、速度快,只有一个二进制文件。 跟踪文件 你可以使用 exa 来跟踪某个 Git 仓库中新增的文件。...扩展文件属性 当你使用 exa 探索 xattrs(扩展的文件属性)时,--extended 会显示所有的 xattrs。...它的颜色编码让我更容易多个子目录中进行搜索,它还能帮助我了解当前的 xattrs。

1.9K40

dotnet 如何在 Mock 模拟 Func 判断调用次数

第二句传入参数 0 返回值是 林德熙是逗比 因为上面定义 如上面代码写的,如果我期望定义的参数是一个范围不是某个数,那么我需要采用 It 这个类的帮助 判断参数符合某个条件的任意参数,可以使用 Is...方法,如在传入任何的一个大于零的参数 mock.Setup(func => func(It.Is(n => n > 0))).Returns("林德熙是逗比"); 这里可以使用的是委托,所以复杂的条件也可以自己写...另外 It 还提供很多其他的帮助方法,可以简化代码,这些自己写一下就知道 这里的 It 不仅可以 Setup 使用,也可以 Verify 方法使用,如判断用户传入小于0的参数的时候,这个方法被调用一次...mock.Verify(func => func(It.Is(n => n < 0)), Times.Once); 如果不要求传入的是什么参数,包括各种边界值都可能传入,那么请直接使用下面方法...Never 请看代码 mock.Verify(func => func(It.IsAny()), Times.Never); 当然还有方法至少被调用多少次,方法最多被调用多少次等,这些很简单

80130

dotnet 如何在 Mock 模拟 Func 判断调用次数

第二句传入参数 0 返回值是 林德熙是逗比 因为上面定义 如上面代码写的,如果我期望定义的参数是一个范围不是某个数,那么我需要采用 It 这个类的帮助 判断参数符合某个条件的任意参数,可以使用 Is...方法,如在传入任何的一个大于零的参数 mock.Setup(func => func(It.Is(n => n > 0))).Returns("林德熙是逗比"); 这里可以使用的是委托,所以复杂的条件也可以自己写...另外 It 还提供很多其他的帮助方法,可以简化代码,这些自己写一下就知道 这里的 It 不仅可以 Setup 使用,也可以 Verify 方法使用,如判断用户传入小于0的参数的时候,这个方法被调用一次...mock.Verify(func => func(It.Is(n => n < 0)), Times.Once); 如果不要求传入的是什么参数,包括各种边界值都可能传入,那么请直接使用下面方法...Never 请看代码 mock.Verify(func => func(It.IsAny()), Times.Never); 当然还有方法至少被调用多少次,方法最多被调用多少次等,这些很简单

1.2K40

Moq基础(五)

一章我们将讲了伪造属性和事件 这一章我们将参数匹配,回调,和验证 ---- It:参数匹配 It 这个类其实我们已经在前面有所涉及。我们使用It.IsAny()匹配任意字符串。...It.IsAny,匹配指定类型参数 It.IsNotNull,匹配指定类型参数,Null除外 It.Is(Predicate),匹配指定类型参数,满足Predicate的条件 It.IsInRange...> Console.WriteLine("After returns")); ---- Verification:验证 验证是Assert环节行为,此时的伪对象作用是Mock 这里也只列出基本功能 Verify...(expression),验证表达式是否被执行 Verify(expression,times),验证表达式的执行次数 其中Times结构体构造可以参见官方文档 VerifyGet(expression...本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

73810

使用 Moq 测试.NET Core 应用 -- Mock 方法

一篇文章, 我单元测试的时候, 把依赖项设为null: ? 然后便出现了NullReferenceException, 导致测试无法正常运行....这样的话, 测试的时候, 抛出的就是ArgumentNullException了, 它可以更恰当的表达程序出现的问题: ? 现在我们可以使用mock版本的依赖项来代替null了: ?...还是红色的, 但现在是测试没通过, 并不是抛出异常. 测试没通过的意思就是期待值和实际返回值不符....MockBehavior是一个枚举, 它有三个值: MockBehavior.Strict, 如果mock对象的方法没有被预先设置好, 那么测试中调用该方法的时候就会抛出异常....测试时会抛出MockException: ? 在对方法进行设置后, 测试就会通过: ? ?

2.3K40

C# 中的动态类型

ValueType 的子类栈(stack)运行,它们的生命周期较短,效率更高。...另一种从 object 继承的类型是引用类型,引用类型堆(heap)分配并进行垃圾回收,CLR 管理着引用类型,并在必要时从堆中释放它们。 查看下图,您可以直观地看到 CLR 的类型系统: ?...请确保使用 string 和 object 作为键和值的类型。否则,将在转换的过程中抛出 RuntimeBinderException 异常。...它是一个抽象类,需要继承它不是实例化它。该类有 14 个虚方法,它们定义了类型的动态操作,每个虚方法都允许重写以指定动态行为。 假设您想要精确控制动态 JSON 中的内容。...使用 Moq 验证调用,一种直观的方式是尝试这么做: _messageBus.Verify(m => m.Send(It.Is(o => o !

3.2K50

C# 可为空引用类型

导致可为空引用类型不尽理想的一些原因在于: 对空值调用成员会导致 System.NullReferenceException 异常抛出,导致生产代码抛出 System.NullReferenceException...不过,遗憾的是,对于可为空引用类型,我们“失败了”,将精力放在了错误的事情不是正确的事情。“失败”操作是指未检查是否为空就调用了引用类型。...将引用类型设为默认不可为空:将所有引用类型都设为默认不可为空,但实现这一点时,应使用可选择启用的编译器开关,不是突然对开发人员的现有代码发出大量警告,让人应接不暇。...不过,与值类型一样,允许为空的引用类型应被看作是例外情况,不是默认情况。...这很遗憾,但支持可为空引用类型应该会降低 NullReferenceException 抛出可能性,尽管不是完全杜绝。(这类同于分配变量时的编译器检查易错性。)

14320

NullReferenceException,就不应该存在!

另外,NullReferenceException 异常发生的地方一定不是真正出错的地方!因为我们尝试去调用某个属性或方法时假设了它不为 null,这意味着它为 null 就是个错误。...那么 DoSomething 被调用的时候,直接就会抛出 NullReferenceException。这个方法比较简单,我们猜 _value 为 null 基本不会有问题了,方法复杂一点儿就难猜了。...所以,为了解决这些困惑,我建议开发中以如下方式对待我们的 null: 对任何可被外部模块调用的方法的参数进行 null 判断,并在参数为 null 时抛出 ArgumentNullException。...如果你无法根据现有状态完成方法承诺的任务,请抛出具体的异常并给出真实的原因。 如果确实要用 null 程序中代表某种状态,请确定这能够代表某种唯一确定的状态,并强制要求使用方判空。...再次重申:我们使用 null 一定是因为它代表了某种确定的特殊含义,不是代表了一堆不明所以的错误!

1.1K10

c#值类型与引用类型区别

试图使用null引用类型变量会抛出NullReferenceException异常。相反,值类型的变量总是包含其基础类型的一个值,而且值类型的所有成员都初始化为0。...值类型变量不是指针,访问值类型不可能抛出NullReferenceException异常。CLR确实允许为值类型添加“可空”(nullability)标志。...基于一条,两个或多个引用变量能引用堆中同一个对象,所以对一个变量执行的操作可能影响到另一个变量引用的对象。...相反,值类型变量自成一体,对值类型变量执行的操作不可能影响另一个值类型变量 由于未装箱的值类型不在堆中分配,一旦定义了该类型的一个实例的方法不再活动,为它们分配的存储就会被释放,不是等着进行垃圾回收。

77020

Nullable Reference Types 可空引用类型

写C#代码的时候,你可能经常会遇到这个错误: ? 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。...C# 8可以让你在编译时就避免null引用错误,它并不是把null值从代码里移除了,而是它可以让你表达意图。具体的做法就是你可以告诉编译器哪个引用可能是null的,哪些引用不可能是null。...但是C# 8之前,如果我们这样调用该方法,那么在编译时是不会报错的: ? 如果运行程序,那么结果就是: ?...这个叹号的作用仅仅是去掉了警告,它没有改变任何运行时的状况,如果Address为null,那么这句话仍然会抛出NullReferenceException。...但是还要记住,这个只是在编译时进行的检查,如果成员为null,还是会抛出异常的。这种操作对于运行时来说没有任何改变。 解决成员出现的警告 使用构造函数对成员初始化,可以去掉这些警告: ?

77430

应该抛出什么异常?不应该抛出什么异常?(.NETC#)

null 参数后,方法必然执行失败 —— 抛出了一个 NullReferenceException。...if (sender is Button button) button.Content = "Clicked"; 这是在逃避问题,不是解决问题!...写这段代码的人并没有调查 sender 不是 Button 类型的原因,到底是因为 Grid 监听了路由事件的 Click,还是因为多个控件都把事件处理函数设为了这个方法。...程序中的异常 异常处理中,每一位开发者应该从根源自己的代码中消灭“实现异常”(不是“逃避”),同时使用异常”的帮助下正确调用其他方法,那么代码中将只剩下“环境异常”(和小部分性能导致的“实现异常...此时,开发者们将有更多的精力关注“解决的具体业务”上面,不是不停地解决编码的 BUG。 特别的,“实现异常”可以被单元测试进行有效的检测。

1.6K20

成员可能是null的

写C#代码的时候,你可能经常会遇到这个错误: image.png 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。...C# 8可以让你在编译时就避免null引用错误,它并不是把null值从代码里移除了,而是它可以让你表达意图。具体的做法就是你可以告诉编译器哪个引用可能是null的,哪些引用不可能是null。...“,表示Address肯定不是null: image.png 这个叹号的作用仅仅是去掉了警告,它没有改变任何运行时的状况,如果Address为null,那么这句话仍然会抛出NullReferenceException...所以,只有确认我们访问的东西肯定不是null的时候,才应该使用"!"。...解决成员出现的警告 使用构造函数对成员初始化,可以去掉这些警告: image.png 另外一种办法就是直接对属性进行初始化: image.png 我们还是采用构造函数初始化的办法吧。

57131

一文看懂 .NET 的异常处理机制、原则以及最佳实践

因此我们需要在 finally 块中确保资源可被回收,这样当重新使用这个文件的时候能够立刻使用不会被占用。...对极为常见的错误案例返回 null(或默认值),不是引发异常。极其常见的错误案例可被视为常规控制流。通过在这些情况下返回 NULL(或默认值),可最大程度地减小对应用的性能产生的影响。...异常的分类 该不该引发异常 小节中我们说到一个异常会被引发,是因为某个方法声称的任务没有成功完成(失败),失败的原因有四种: 方法的使用者用错了(没有按照方法的契约使用) 方法的执行代码写错了 方法执行时所在的环境不符合预期...实现错误: 前面由 CLR 抛出的异常代码主要都是实现错误 NullReferenceException 试图空引用上执行某些方法,除了告诉实现者出现了意料之外的 null 之外,没有什么其它价值了...原因上会类似于托管中的 NullReferenceException

55941

WPF 支持的多线程 UI 并不是线程安全的

WPF 支持创建多个 UI 线程,跨窗口的或者窗口内的都是可以的;但是这个过程并不是线程安全的。 你有极低的概率会遇到 WPF 多线程 UI 的线程安全问题,说直接点就是崩溃。...这些 UI 线程都显示 WPF 窗口 无论是 .NET Framework 4.7.2 版本的 WPF,还是 .NET Core 3 版本的 WPF 都会出现此问题 现象: 抛出异常,程序崩溃 比如下面是其中一种异常...: Exception thrown: 'System.NullReferenceException' in WindowsBase.dll Object reference not set to an...System.NullReferenceException: Object reference not set to an instance of an object....Walterlv.Bugs.MultiThreadedUI\Walterlv.Bugs.MultiThreadedUI\Program.cs:line 33 下图是 .NET Core 3 版本的 WPF 中

27320

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

不要也不要让属性获取器抛出异常,避免修改对象状态。这样就意味着需要一种方法不是属性获取器。...如果你认为一个对象的运行时类型可能比编译时类型更具体,那么你可以使用“is”或“as”运算符。 第二种类型转换引发了一个问题,“为什么操作是开始的地方执行的,不是目标数据类型?”...要将格式不正确的字符串正常转换为数字,请使用TryParse()方法; 不是抛出异常,它返回一个布尔值,指示解析是否成功。 使用异常处理范围 catch内部写代码,并且仔细处理成程序块。...除非你的意图只是简单的记录并重新抛出异常。某些例外可能使应用程序处于一种状态,那么就需要避免处理所有异常或根类异常的实例。最好是没有进一步损坏的情况下应用已经崩溃,不是试图恢复并造成损害。...开发期间,专注于正确性不是细微优化。经常根据目标衡量你的效果。如果你没有达到目标,则应该花费时间来优化程序。

2.2K90
领券