升级Visual Studio 2013和Microsoft Fakes v12后ShimNotImplementedException

时间:2015-07-28 14:47:59

标签: visual-studio unit-testing visual-studio-2013 microsoft-fakes

我们正在使用Microsoft Fakes与Visual Studio 2013.在更新到Visual Studio 2013 Update-4或Update-5之后,我们在测试中得到ShimNotImplementedException

我们followed instructions found in other SOF questions并关闭了SpecificVersion个引用的Microsoft.QualityTools.Testing.Fakes。这允许编译,但运行时测试仍然失败。

2 个答案:

答案 0 :(得分:1)

我们需要解决此问题的提示见MSDN forums

  

根本问题是遗留测试没有定义具体方法   在基于代码的ShimXXX对象上使用。在版本11下   一切都很好;版本12是另一回事。

ShimNotImplementedException的堆栈跟踪提供了有关缺失属性/方法的所需信息:

Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotImplementedException
at $Func`2NotImplementedf5b9281e-32b0-4bf3-9079-6a54470670de.Invoke(SiteContext arg1)
at Sitecore.Sites.SiteContext.get_Database() //THIS IS THE PROBLEM PROPERTY
at Sitecore.Ecommerce.ShopContext..ctor(SiteContext innerSite)
at ActiveCommerce.UnitTest.ProductStockManagerTests.get_MockShopContext()
at ActiveCommerce.UnitTest.ProductStockManagerTests.GetAvailability_AlwaysInStock()

将缺少的属性添加到我们的垫片构造中解决了这个问题:

        return new Sitecore.Ecommerce.ShopContext(new ShimSiteContext
        {
            PropertiesGet = () => new NameValueCollection(),
            DatabaseGet = () => null //ADDING THIS SOLVED THE ISSUE
        });

答案 1 :(得分:1)

在使用Visual Studio 2015将我们的几个项目从.NET 4升级到.NET 4.5.2之后,我遇到了类似的问题。突然之间几个先前通过的测试开始失败。共同点是所有测试都使用Shims来模拟注册表访问。

似乎发生的事情是处理Dispose方法时发生了一些变化。最初我没有在RegistryKey填充程序上实现Dispose方法。这似乎不会导致在.NET 4下运行时出现任何问题。但是在切换到4.5.2后,它会被隐式地一直调用。

解决方案很简单:我刚为Dispose添加了一个存根。

Microsoft.Win32.Fakes.ShimRegistryKey.AllInstances.Dispose = (key) => { };

现在测试再次通过。

请注意,将其设置为NULL确实解决它。必须有一种方法。