用msg抛出?抛出带有不受支持的字符的RuntimeException

时间:2018-11-27 07:29:22

标签: unit-testing clojure

我正在尝试运行预期会引发某些异常的测试。 throws?可以正常工作,但是当我尝试thrown-with-msg?时会抛出异常。为了测试它,我从documentation

代码:

(deftest check-exception
  (testing "If Exception is thrown"
    (is (thrown-with-msg? java.lang.ArithmeticException #\"Divide by zero\" (/ 1 0)))))

编译错误:

  

线程“主”中的异常clojure.lang.LispReader $ ReaderException:java.lang.RuntimeException:不支持的字符:\“ Divide

需要传递的第三个参数是Regular Expression。我该如何通过?

2 个答案:

答案 0 :(得分:2)

Clojure中的正则表达式的文字为\。因此,您在此处使用的#"\"Divide by zero\""是错误的。如果要在regexp文字中包含引号,则可以像对待引号一样对其进行引号。例如。 (is (thrown-with-msg? ArithmeticException #\"Divide by zero\" (/ 1 0)))

编辑 :(从字面上看)混乱的根源

source code实际上在文档字符串中包含以下行:

"

但这是由于还需要在文档注释中引用doc。用例如只看文档REPL中的user=> (require 'clojure.test) user=> (doc clojure.test) ... (is (thrown-with-msg? ArithmeticException #"Divide by zero" (/ 1 0))) ...

// from an external C api
void f(int i, void (*g)());

const int n = ...
void a0(); void a1(); ...
void (*a[n])();

int main()
{
  a[0] = a0; a[1] = a1; ...
  for (int i = 0; i != n; ++i)
    f(i, a[i]);
  ...
}

显示正确的代码。

答案 1 :(得分:0)

正则表达式如下:

(deftest check-exception
  (testing "If Exception is thrown"
    (is (thrown-with-msg? java.lang.ArithmeticException #"^.*Divide by zero.*$" (/ 1 0)))))