如何在emacs中测试交互功能?

时间:2015-10-06 04:36:08

标签: user-interface testing emacs

我是an Emacs package的维护者,其整个目的与用户互动有关。每当我对代码进行更改时,我都必须手动测试它以查看它是否有效。如果我能做一些自动化测试会很好,但我不知道如何以这样做的方式模拟用户输入。有没有办法运行一个交互式功能,提示用户,然后通过模拟输入(包括像C-j这样的组合键)响应该提示?

2 个答案:

答案 0 :(得分:6)

新功能:我已使用with-simulated-input重新实现了我的execute-kbd-macro宏,因此现在也可以在批处理模式下运行。您可以查看新实施here

原始答案:

我在a question on the Emacs SX site找到了答案。基本上,在将其转换为正确的格式后,您必须将所需的键序列放入unread-command-events。例如:

(let ((unread-command-events (listify-key-sequence (kbd "blu RET"))))
  (ido-completing-read "Select a color: " '("yellow" "blue")))

正确返回"blue"

要注意的一件事是你必须确保你的键序列肯定会终止命令的交互部分,否则命令将继续等待输入。确保终止的一种方法是将“C-g”附加到密钥序列,如果在到达密钥序列结束时尚未完成,则将中止命令。如果命令完成,那么当let-binding超出范围时,任何未使用的输入都将被丢弃,因此C-g事件不会发出错误信号。所以更合适的测试可能是:

;; Runs successfully
(condition-case nil
    (let ((unread-command-events (listify-key-sequence (kbd "blu RET C-g"))))
      (ido-completing-read "Select a color: " '("yellow" "blue")))
  (quit (error "Reached end of `unread-command-events' without terminating")))

;; Throws an error
(condition-case nil
    (let ((unread-command-events (listify-key-sequence (kbd "blu C-g"))))
      (ido-completing-read "Select a color: " '("yellow" "blue")))
  (quit (error "Reached end of `unread-command-events' without terminating")))

这种方法的一个重要警告是,尽管允许您完全以非交互方式运行交互式功能,但它将无法在批处理模式emacs会话中运行,可能是因为emacs不处理完全以批处理模式输入键盘。

答案 1 :(得分:2)

您可以使用execute-kbd-macro和ERT。我在my test file中有一个非常简单的实现。 测试看起来非常整洁 - 几乎就像我是以交互方式按键:

(ert-deftest ivy-read ()
  (should (equal
           (ivy-with '(ivy-read "pattern: " '("blue" "yellow"))
                     "C-m")
           "blue"))
  (should (equal
           (ivy-with '(ivy-read "pattern: " '("blue" "yellow"))
                     "y C-m")
           "yellow"))
  (should (equal
           (ivy-with '(ivy-read "pattern: " '("blue" "yellow"))
                     "y DEL b C-m")
           "blue"))
  (should (equal
           (ivy-with '(ivy-read "pattern: " '("blue" "yellow"))
                     "z C-m")
           "z")))