如何跟踪 Purescript 测试中的失败断言

How to trace a failing assertion in a Purescript test

我正在使用 Purescript 做第一步并复制 "hello world" app

测试通过。我是故意闯关的。

module Test.Main where

import Prelude
import Effect (Effect)
import Euler (answer)
import Test.Assert (assert)

main :: Effect Unit
main = do
  assert (answer == 233161)

报告了手工错误,但错误报告的质量让我担心,因为无论如何它都无助于发现错误。 有一个冗长的 JS 堆栈跟踪,没有任何对原始文件或 Purescript module/function 的引用! 这是一个只有 1 个测试的超级简单的应用程序,但是我应该如何在真实应用程序的无数测试大海捞针中找到那根针?

spago test
[info] Installation complete.
Compiling Test.Main
[info] Build succeeded.
/home/dan/demo/pure-script/1/output/Test.Assert/foreign.js:6
      if (!success) throw new Error(message);
                    ^

Error: Assertion failed
    at Object.main (/home/dan/demo/pure-script/1/output/Test.Assert/foreign.js:6:27)
    at Object.<anonymous> (/home/dan/demo/pure-script/1/.spago/run.js:3:32)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:282:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
[error] Tests failed: exit code: 1

正如您可能从 purescript-assertREADME 中推断的那样,Test.Assert 模块只是实际测试库作者的超级基本断言库(因为他们不能使用他们自己的库而不会导致循环依赖)。

因此它不应该提供非常好的错误堆栈和位置信息。使用 assert 的包通常会在两者之间进行大量日志记录:

main = do
  Console.log "Testing answer"
  Console.log "assert answer is 42"
  assert $ answer == 42

  Console.log "assert answer is answer to everything"
  assert $ answer `isAnswerTo` "everything"

我建议使用 purescript-spec 来处理更严重的问题。不幸的是,PureScript 的调试和测试故事并不是最好的,但该语言在其他方面确实很出色。