首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何获得传递给模拟方法的对象的详细日志?

如何获得传递给模拟方法的对象的详细日志?
EN

Stack Overflow用户
提问于 2020-07-17 03:00:06
回答 1查看 40关注 0票数 0

我在一段复杂的代码中遇到了一个失败的单元测试,而Moq日志记录并不是为我做的。我需要知道,我所期望的方法与实际调用的方法有什么不同。最后,我将调试器附加到单元测试,这样我就可以查看传递给moq的对象,并手动比较它的所有值。如果我从Verify错误消息中获得更多信息,那么所有这些努力都是不必要的。

我如何记录这两件事之间的区别?

  • 我预期模拟的方法会被
  • 调用,模拟的方法实际上是用

调用的

一个简化的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace MyNamespace
{
    [TestClass]
    public class MyTestClass
    {
        [TestMethod]
        public void MyTestMethod()
        {
            // Arrange
            var serviceMock = new Mock<IService>();
            var model = new Model
            {
                Word = "Foo",
                Number = 1
            };
            var servicecaller = new ServiceCaller(serviceMock.Object);

            // Act
            servicecaller.CallService(model);

            // Assert
            serviceMock.Verify(mock =>
                mock.Call(
                    It.Is<Model>(m =>
                        m.Word == "Bar"
                        && m.Number == 1)));
        }
    }

    public class ServiceCaller
    {
        private IService _service;
        public ServiceCaller(IService service)
        {
            _service = service;
        }

        public void CallService(Model model)
        {
            _service.Call(model);
        }
    }

    public interface IService
    {
        void Call(Model model);
    }

    public class Model
    {
        public int Number { get; set; }
        public string Word { get; set; }
    }
}

当您运行此测试时,它将失败并显示以下消息:

测试方法MyNamespace.MyTestClass.MyTestMethod至少在模拟上抛出异常: Moq.MockException:预期调用一次,但从未执行过:模拟=> mock.Call(It.Is(m => m.Word ==“Bar& m.Number == 1))没有配置任何设置。执行调用:IService.Call(模型)

但我想让它记录一些内容如下:

执行调用: IService.Call(Model { Word:"Bar",Number: 1 })

甚至更好:

“传递给IService.Call的对象断言失败: Model.Word 'Foo‘不等于'Bar'".

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-17 04:42:05

您可能需要通过Mock.Invocations验证调用,这是模拟上所有调用的序列,以及提供的参数。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var callInvocations = serviceMock.Invocations.Where(x => x.Method.Name.Equals(nameof(IService.Call)));
var matchingInvocations = callInvocations.Where(x =>
{
    var model = x.Arguments.First() as Model;
    return model.Word.Equals("Bar") && model.Number == 1;
});

if (!matchingInvocations.Any())
{   
    throw new Exception($"Performed invocations:{Environment.NewLine}{string.Join(Environment.NewLine, callInvocations.Select(x => $"{x.Method.DeclaringType.Name}.{x.Method.Name}({string.Join(", ", x.Method.GetParameters().Select((y, i) => $"{y.ParameterType.Name} {JsonConvert.SerializeObject(x.Arguments[i])}"))})"))}");
}

将提供所需的输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62952597

复制
相关文章
如何获得对象的retain count
Mac特别是iPhone中的内存管理是通过引用计数来实现的。 而对于开发者来说,特别是从具备垃圾回收功能的语言开发工程师来说,这种内存管理方式具有很大的挑战性。
EltonZheng
2021/01/26
1.7K0
JavaScript获得对象属性个数的方法
//扩展对象的count方法 Object.prototype.count = ( Object.prototype.hasOwnProperty(‘__count__’) ) ? fun
就只是小茗
2018/03/07
2K0
「iOS」swift 和 objectivec 获得对象的 class 或者 Type 的方法
一、oc 中使用 oc 中非常简单 一行搞定 NSString* str1 = @"test"; [str1 class]; 这里的 [str1 class];就是获取对象 class 的方法 二、swift 中使用 时间紧,任务重,上代码 var str: String = "test" print("str class is :: \(type(of: str))") 这里的 type(of: str)就是获取对象 class 的方法 三、转成字符串 这里
圆号本昊
2021/09/24
8320
「iOS」swift 和 objectivec 获得对象的 class 或者 Type 的方法
一、oc 中使用 oc 中非常简单 一行搞定 NSString* str1 = @"test"; [str1 class]; 这里的 [str1 class];就是获取对象 class 的方法 二、swift 中使用 时间紧,任务重,上代码 var str: String = "test" print("str class is :: \(type(of: str))") 这里的 type(of: str)就是获取对象 class 的方法 三、转成字符串 这里
圆号本昊
2021/12/30
1.4K0
网络数据是如何传递给进程的
在用户态空间,调用发送数据接口 send/sento/wirte 等写数据包,在内核空间会根据不同的协议走不同的流程。以TCP为例,TCP是一种流协议,内核只是将数据包追加到套接字的发送队列中,真正发送数据的时刻,则是由TCP协议来控制的。TCP协议处理完成之后会交给IP协议继续处理,最后会调用网卡的发送函数,将数据包发送到网卡。
luoxn28
2020/05/18
1.6K0
对象的传值与返回
对象的传值与返回 说起函数,就不免要谈谈函数的参数和返回值。一般的,我们习惯把函数看作一个处理的封装(比如黑箱),而参数和返回值一般对应着处理过程的输入和输出。这种情况下,参数和返回值都是值类型的,也就是说,函数和它的调用者的信息交流方式是用过数据的拷贝来完成,即我们习惯上称呼的“值传递”。但是自从引入了“引用”的概念后,函数的传统模型就不再那么“和谐”了。引用的传递可以允许函数和调用者共享数据对象,它们之间的信息交流不再使用信息拷贝的方式,而是使用更有效率的信息共享的方式,引用导致函数的参数并有输入和输出
Florian
2018/02/05
2.5K0
对象的传值与返回
[HTML] websocket的模拟日志监控界面
模拟命令行的界面效果,使用swoole作为websocket的服务,重新做了下html的界面效果
唯一Chat
2020/01/14
8770
[HTML] websocket的模拟日志监控界面
恭喜你获得治疗this“皮”的详细药方
众所周知,this在JavaScript中的指向一直很难让人理解,想要学好JavaScript,this也是我们必须要搞清楚的。其实,this并没有那么难,本文将力争带你治疗this的“皮”。
童欧巴
2020/03/30
2740
恭喜你获得治疗this“皮”的详细药方
如何通过反射调用对象的方法?
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str));
唐怀瑟
2018/08/30
2.8K0
QQ如何把你消息传递给好友的?(下篇)
话说你已经成功注册了QQ号码,取名叫“村头小伙”。你的同学小芳“村里那个姑娘”也接受了你的好友申请。之后的日子里面,你们经常通过QQ发送文字和语音,偶尔还会视频聊天。那么文字和语音如何到达小芳手机的?通过这篇文章,张叔叔保证让你豁然开朗。
张叔叔讲互联网
2018/10/29
8770
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
QQ如何把你消息传递给好友的?(上篇)
张叔叔先告诉大家一个数据:QQ注册用户量累计超过10个亿,QQ日活超过3亿,月活超过5亿。日活直白点说就是每天使用QQ的用户量,月活就是每个月累计活跃的用户量。中国人口13.8亿,几乎人人都有QQ号,大家都是腾讯的忠实用户!
张叔叔讲互联网
2018/10/29
1.2K0
BeautifulSoup文档2-详细方法 | 对象的种类有哪些?
1 使用细节 将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象,; 可以传入一段字符串或一个文件句柄,比如: from bs4 import BeautifulSoup soup = BeautifulSoup(open("index.html")) soup = BeautifulSoup("<html>data</html>") 2 对象的种类 2.1 种类说明 Beautiful Soup将HTML文档转换成一个树形结构,每个节点都是Python对象; 所有对象为4种:
虫无涯
2023/02/21
5620
vue通信、传值的多种方式(详细)
朋友们可以百度下 Session Storage(程序退出销毁) 和 Local Storage(长期保存) 的区别。
全栈程序员站长
2022/06/28
9820
vue通信、传值的多种方式(详细)
​flash模拟eeprom存储日志的原理
做mcu开发时,涉及到数据存储时,往往都会考虑使用flash、eeprom,或者铁电存储器。从数据储存的角度上来说,安全性最高的肯定是FRAM,接着才会考虑使用EEPROM,对于一般的数据储存,flash就足够了。考虑到一般的MCU都不会携带EEPROM,最简单的方案可以利用flash模拟出eeprom,并且实现基本的日志文件系统操作,下面来描述一下基本的原理。
bigmagic
2021/03/09
2.3K0
如何删除对象的某个属性(对象属性方法是什么)
const object = { ‘a’: 1, ‘b’: ‘2’, ‘c’: 3 };
全栈程序员站长
2022/07/29
4.5K0
如何在 Node.js 中正确的使用日志对象
地址:https://mp.weixin.qq.com/s/Pb51aYdrxAALM_wR4asDgg
coder_koala
2021/08/26
9770
方法的详细使用
**明确返回值类型:**方法计算的是整数的求和,结果也必然是个整数,返回值类型定义为int类型。
星哥玩云
2022/09/14
2650
方法的详细使用
如何在 Node.js 中正确的使用日志对象
日志,是开发者排查问题的非常重要的手段,有时候甚至是唯一的,所以如何合理并正确的打印日志,成了开发时的重中之重。
程序狗
2022/01/04
1.1K0
点击加载更多

相似问题

如何获得Spring Beans加载的详细日志?

10

如何获得django csrf故障的详细日志?

15

如何检查传递给模拟对象的方法的参数

15

如何在传递给模拟方法的对象上调用方法

22

模拟日志对象

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文