我只是想熟悉Visual Studio 2012 RC中新的Fakes Isolation Framework,但我因此面临着ShimNotSupportedExceptions的问题.
在第一次尝试时,我尝试连接一个委托的每个单一的shim方法,ShimNotSupportedException在尝试运行/调试测试时抛出了一个.
[TestMethod]
public void GetFoo_ValidBar_ReturnsBaz()
{
using(ShimsContext.Create())
{
ShimDateTime.NowGet = () => new DateTime(2012,08,11,10,20,59);
const string expected = "20120811_102059";
string actual = GetFoo();
Assert.AreEqual(expected,actual);
}
}
Run Code Online (Sandbox Code Playgroud)
这是相应的堆栈跟踪:
GetFoo_ValidBar_ReturnsBaz测试方法抛出了一个异常:Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException:System.DateTime,位于Microsoft.QualityTools的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent(T值,Action1 eh). Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver,MethodBase)中的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase方法)中的Testing.Fakes.UnitsTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase方法)方法,委托detourDelegate)Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase方法,Delegate detourDelegate)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub,Object optionalReceiver, MethodBase方法)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime的Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub,Type receiverType,Object optionalReceiver,String name,ShimBinding flags,Type returnType,Type [] parameterTypes) .SetShimPublicStatic(Delegate optionalStub,Type receiverType,String name,Type returnType,Type [] parameterTypes)在BazTests.cs的GetFoo_ValidBar_ReturnsBaz()的System.Fakes.ShimDateTime.set_NowGet(Func'1值):第48行.
在阅读了我在MSDN上找到的两个线程处理这个问题后,我按照他们的指示(关闭CodeCoverage,删除.testsettings文件)这对我不起作用!
不过我找到了解决这个问题的方法:
首先从测试资源管理器运行所有测试(而不是直接在编码区域外使用"MSTest测试(点击运行)"按钮)一切正常,没有抛出任何异常.之后我甚至可以调试测试,并且对shim方法的赋值也按预期工作.
这适用于我使用的所有后续垫片.
但是,当我尝试实现MS Enterprise Library的伪造数据库访问时,我又遇到了同样的问题.
这是测试的样子:
[TestMethod]
public void GetFooFromEF_NonEmptyDataReader_ObjectsCorrectlyInstantiated()
{
using(ShimsContext.Create()){
var dataReader = new StubIDataReader() …Run Code Online (Sandbox Code Playgroud)