C# 如何模仿伊达塔雷科德?

C# 如何模仿伊达塔雷科德?,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,我试图用Moq模拟一个IDataRecord 模拟创建如下所示: Mock<IDataRecord> mockDataRecord = new Mock<IDataRecord>(); Mock mockDataRecord=new Mock(); 被测线路为: DateTime timestamp = dataRecord.GetValueOrDefault<DateTime>("QUEUE_ADD_TS"); DateTime timestamp=d

我试图用Moq模拟一个
IDataRecord

模拟创建如下所示:

Mock<IDataRecord> mockDataRecord = new Mock<IDataRecord>();
Mock mockDataRecord=new Mock();
被测线路为:

DateTime timestamp = dataRecord.GetValueOrDefault<DateTime>("QUEUE_ADD_TS");
DateTime timestamp=dataRecord.GetValueOrDefault(“队列添加”);
已尝试:

mockDataRecord.Setup(r => r.GetValueOrDefault<DateTime>("QUEUE_ADD_TS")).Returns(now);
mockDataRecord.Setup(r=>r.GetValueOrDefault(“队列添加”))。返回(现在);
…但它给出了一个运行时错误:

表达式引用不属于模拟对象的方法 对象:r=>r.getValuerDefault(“队列添加”)


还尝试用
It.IsAny()
代替
中的“队列添加”
,但没有效果。这应该很容易,但我抓挠我的头-感谢任何建议

您不能模拟静态或扩展方法,因为大多数模拟框架都在幕后使用动态代理

在测试中,不要存根扩展方法。取而代之的是原始方法本身,如:

mockDataRecord.Setup(r => r.GetValue<DateTime>("QUEUE_ADD_TS")).Returns(now);
mockDataRecord.Setup(r=>r.GetValue(“队列添加”))。返回(现在);
您应该单独测试扩展方法,如:

  • 存根GetValue方法并断言GetValueOrDefault返回存根值

  • 不要存根GetValue方法,并断言GetValueOrDefault返回默认值


  • 我这样做,又快又脏:

    Mock<IDataRecord> dataRecord = new Mock<IDataRecord>();
    dataRecord.Setup(column => column["applicationno"]).Returns("foobar");
    dataRecord.Setup(column => column["numberOfApplications"]).Returns(12);
    
    Mock dataRecord=new Mock();
    Setup(column=>column[“applicationno”])。返回(“foobar”);
    设置(列=>列[“numberOfApplications”])。返回(12);
    
    我在
    IDataRecord
    界面上没有看到任何
    GetValueOrDefault
    方法。这不是一种扩展方法吗?很确定,这正是错误所暗示的。GetValuerDefault是一个扩展方法,因此不能直接存根。试着用stub代替索引器,我相信在某处会有这样的例子:)啊,你们都是对的!事实证明,
    GetValueOrDefault
    是一种扩展方法,并且是静态的,因此不容易被模仿。现在还不太清楚这是如何工作的,但仔细研究一下……这确实是我现在正在做的事情——以前从未真正遇到过扩展方法!(我不知道,你离开c#几年后回来,球门柱移动了;-))。我唯一的问题是有很多设置方法,关于StackOverflow的普遍共识是每个Setup()都应该由一个等效的Verify()匹配。似乎有些过分,会使代码更难维护-我真的需要这样做吗?或者我可以用Verifiable()代替吗?VerifyAll()似乎比将每个Setup()与Verify()配对要好。显然,这应该在个案基础上进行。你将是最好的判断:-)我已经完成了所说的abve,类似于这样:this.dataRecord.Setup(d=>d.GetValue(“WorkItemId”)).Returns(1);但我得到的对象引用并没有设置为对象的实例…我做错了什么?看起来我和评论中的一样。好的,对不起,我知道我做错了什么。我在setuptests方法中声明了新的Mock。并且此方法没有注释TestInitialize。所以这个对象从未被创建过。。。