我刚刚开始使用 FsCheck 并一直在编写一些简单的测试。但是我一直遇到一个问题,它导致 Xunit 抛出异常,然后杀死 VS2012 测试运行程序(测试似乎永远运行)。
似乎任何返回非文字结果的尝试都会导致此异常。一些例子:
///This will work, the test will trivially succeed and the result values
///will be available in the "test output" screen in VS2012's test explorer.
let [<Property>] ``Test case #1`` (x : Int32) =
(x > 3) ==>
let result = (x > 5)
printfn "Result = %O" result
true
///This will cause the IndexOutOfRangeException which kills xUnit, causing the test
///to "run" until cancelled in VS2012's test explorer.
let [<Property>] ``Test case #2`` (x : Int32) =
(x > 3) ==>
(x > 5)
///This also kills xUnit.
let [<Property>] ``Test case #3`` (x : Int32) =
(x > 5)
我通过 NuGet 安装了 FsCheck.Xunit——FsCheck.Xunit 的 0.4.02 版、FsCheck 的 0.9.2.0 和 Xunit 的 1.9.2。我正在运行 VS2012。我尝试以相同的结果同时定位 .Net 版本 4 和 4.5。
这是VS2012输出窗口的内容,但有例外:
------ 运行测试开始 ------ System.Reflection.TargetInvocationException: 调用的目标已抛出异常。---> System.IndexOutOfRangeException:索引超出了数组的范围。在 Xunit.ExceptionUtility.GetStackTrace(IFailureInformation failureInfo, Int32 index) 在 Xunit.Runner.VisualStudio.TestAdapter.VsExecutionVisitor.Visit(ITestFailed testFailed) 在 Xunit.TestMessageVisitor.DoVisit[TMessage](IMessageSinkMessage 消息,Func
2 callback) at Xunit.TestMessageVisitor.OnMessage(IMessageSinkMessage message) at Xunit.TestMessageVisitor
1.OnMessage(IMessageSinkMessage message) 在 Xunit.TestClassCallbackHandler.OnTest(XmlNode xml) 在 Xunit.TestClassCallbackHandler.OnXmlNode(XmlNode xml) 在 Xunit.XmlNodeCallbackHandler.System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(String eventArgument) 在 System.Web。 UI.ICallbackEventHandler.RaiseCallbackEvent(String eventArgument) --- 内部异常堆栈跟踪结束 --- System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal Xunit.Sdk.ExecutorCallback.CallbackEventHandlerCallback 中的 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) 中的(对象 obj、Object[] 参数、Object[] 参数)。在 Xunit.Sdk.Executor.RunTests.<>c__DisplayClass12.<.ctor>b__11(ITestResult 结果) 在 Xunit.Sdk.TestClassCommandRunner.Execute 在 Xunit.Sdk.Executor.OnTestResult(ITestResult 结果,ExecutorCallback 回调) 通知(字符串值) (ITestClassCommand testClassCommand,列表1 methods, Predicate
1 startCallback,谓词1 resultCallback) at Xunit.Sdk.Executor.RunTests.<>c__DisplayClass12.<.ctor>b__f() at Xunit.Sdk.Executor.ThreadRunner(Object threadStart) at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart(Object obj) Index was outside the bounds of the array. at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Xunit.Sdk.ExecutorCallback.CallbackEventHandlerCallback.Notify(String value) at Xunit.Sdk.Executor.OnTestResult(ITestResult result, ExecutorCallback callback) at Xunit.Sdk.Executor.RunTests.<>c__DisplayClass12.<.ctor>b__11(ITestResult result) at Xunit.Sdk.TestClassCommandRunner.Execute(ITestClassCommand testClassCommand, List
1 方法,谓词1 startCallback, Predicate
1 resultCallback) 在 Xunit.Sdk.Executor.RunTests.<>c__DisplayClass12.<.ctor>b__f() 在 Xunit.Sdk.Executor.ThreadRunner(Object threadStart) 在 System.Threading.ThreadHelper。 ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System。 Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart(Object obj)
测试用例对我来说看起来不错,我确定我一定遗漏了一些东西,但我看不到什么。有任何想法吗?
编辑:这只发生在测试在 VS2012 测试资源管理器中运行时。如果使用 xUnit GUI 运行,这些测试都会按预期工作。