c# – Moq设置不适用于方法调用,后跟隐式转换

c# – Moq设置不适用于方法调用,后跟隐式转换,第1张

概述对于这个问题,考虑(创建)接口: public interface ITestMe{ string TakeInt64(long x);} 然后运行以下代码: public void Test(){ var mock1 = new Mock<ITestMe>(MockBehavior.Strict); Expression<Func<ITestMe, string>> expr1 对于这个问题,考虑(创建)接口:

public interface ITestMe{  string TakeInt64(long x);}

然后运行以下代码:

public voID test(){  var mock1 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr1 = x => x.TakeInt64(2);  Console.Writeline(expr1);  mock1.Setup(expr1).Returns("OK");  var s1 = mock1.Object.TakeInt64(2L); // OK  var mock2 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr2 = x => x.TakeInt64(DateTime.Today.Year / 1000);  Console.Writeline(expr2);  mock2.Setup(expr2).Returns("OK");  var s2 = mock2.Object.TakeInt64(2L); // OK  var mock3 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr3 = x => x.TakeInt64((int)(DayOfWeek)Enum.Parse(typeof(DayOfWeek),"Tuesday"));  Console.Writeline(expr3);  mock3.Setup(expr3).Returns("OK");  var s3 = mock3.Object.TakeInt64(2L); // OK  var mock4 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr4 = x => x.TakeInt64(GetInt32());  Console.Writeline(expr4);  mock4.Setup(expr4).Returns("OK");  //var s4 = mock4.Object.TakeInt64(2L); // MockException,All invocations on the mock must have a corresponding setup.  var mock5 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr5 = x => x.TakeInt64(int.Parse("2"));  Console.Writeline(expr5);  mock5.Setup(expr5).Returns("OK");  //var s5 = mock5.Object.TakeInt64(2L); // MockException,All invocations on the mock must have a corresponding setup.  var mock6 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr6 = x => x.TakeInt64(GetInt32() + 0);  Console.Writeline(expr6);  mock6.Setup(expr6).Returns("OK");  var s6 = mock6.Object.TakeInt64(2L); // OK  var mock7 = new Mock<ITestMe>(MockBehavior.Strict);  Expression<Func<ITestMe,string>> expr7 = x => x.TakeInt64(1 * int.Parse("2"));  Console.Writeline(expr7);  mock7.Setup(expr7).Returns("OK");  var s7 = mock7.Object.TakeInt64(2L); // OK}static int GetInt32(){  return 2;}

在所有七种情况下,我们创建一个表达式树,其中TakeInt64获取int(Int32)而不是long(Int64).但是,众所周知,存在从int到long的隐式转换,它将出现在表达式树中(expr1除外,编译器为我们转换常量).

为什么上面的案例s4和s5不起作用?奇怪的是,正如你所看到的,如果我们在s6和s7的情况下将0或多次加1,那么它是否有效(即使该类型仍为int,隐式转换为long)?

由于案例expr2,请在3000年之前回答.

解决方法 我认为这是Moq中的一个错误.相关代码在 MatcherFactory.具体而言,转换将从表达式中删除,以便可以进一步检查.当剩余的最顶层表达式节点是方法调用时,将懒惰地评估此节点.当剩下的表达式不是方法调用时,会急切地评估整个表达式(包括Convert!).

这意味着使用延迟评估,比较是在没有Convert和object的情况下完成的.Equals(2,2L)为false.但是,通过热切的评估,转换会被考虑在内,因此您的代码可以运行.

我已经制作了an attempt at fixing this,这似乎解决了我的问题.

(哇,我几乎以为我不会及时做到.)

总结

以上是内存溢出为你收集整理的c# – Moq设置不适用于方法调用,后跟隐式转换全部内容,希望文章能够帮你解决c# – Moq设置不适用于方法调用,后跟隐式转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1230224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存