Microsoft Fakes Shim构造函数失效问题求助
使用Microsoft Fakes Shim构造函数时非自定义属性抛出异常的问题
我尝试按照文档描述的方式Shim构造函数,以Uri类为例的示例代码如下:
using (ShimsContext.Create()) { ShimBehaviors.Current = ShimBehaviors.Fallthrough; System.Fakes.ShimUri.ConstructorString = (@this, s) => { var shim = new ShimUri(@this) { AbsoluteUriGet = () => "http://test" }; }; var uri = new Uri("http://myhost:8100"); Console.WriteLine(uri.Host); }
运行上述代码时,生成的Uri实例中,除了被Shim的AbsoluteUri属性外,其他所有属性访问都会抛出InvalidOperationException,比如最后一行调用uri.Host就会触发该异常。调试时发现@this变量的所有属性也会抛出同样的异常。
我尝试通过ShimBehaviors.Current或Shim内部的InstanceBehavior设置ShimBehaviors.Fallthrough,但均无效果。
我的预期行为是:Shim后的Uri实例,除了自定义的AbsoluteUri返回指定值外,其他行为与正常实例完全一致。
在其他系统类上做相同尝试时,遇到类似问题,只是抛出的是NullReferenceException。
更新内容
后来找到一种可行的解决方法:在Shim构造函数委托内部,通过反射调用@this的构造函数完成正确初始化,并且必须在ShimContext.ExecuteWithoutShims下执行,否则会陷入无限递归。
我仍有疑问:为什么Shim构造函数委托总是获取到“损坏”的@this实例?这是我的使用方式有误,还是Microsoft Fakes的Bug?
内容的提问来源于stack exchange,提问作者Yevgeniy P
相关产品推荐
相关产品推荐

