Kevin Foley writes: > I'm trying to mock the argument collecting function and the custom bulk > function and then test that the arguments returned from the former are > passed to the latter. I'd also like to test the argument function is > only called once while the bulk function is called multiple times. > > Here is an example of what I'm trying to do: > > (org-test-with-temp-text-in-file > "* TODO a\n*TODO b"
Unrelated note: there's a missing a space between the second "*" and "TODO". [...] > (let ((f-called-cnt 0) > (arg-f-call-cnt 0) > (f-called-args nil)) > (cl-letf (((symbol-function 'read-char-exclusive) > (lambda () ?P)) > (org-agenda-bulk-custom-functions > '((?P (lambda (&rest args) > (message "test" args) > (setq f-called-cnt (1+ f-called-cnt) > f-called-args args)) > (lambda () > (setq arg-f-call-cnt (1+ arg-f-call-cnt)) > '(1 2 3)))))) > (org-agenda-bulk-action) > (org-test-agenda--kill-all-agendas) > > (should (= f-called-cnt 2)) > (should (= arg-f-call-cnt 1)) > (should (equal f-called-args '(1 2 3))))))) > > However, this fails with the error void-variable unless I first define > the variables for storing the call counts/arguments. I understand that > defvar makes the variables dynamically bound, however I'm struggling to > understand why that's needed here. I've read the manual entries on > variable binding but I seem to be missing something. > > Can someone help me understand what's going on here? Perhaps you're not capturing the environment due to your quoting: ;; -*- lexical-binding: t; -*- (let ((x 0)) '(t (lambda () x))) ;; => (y (lambda nil x)) (let ((x 0)) (list t (lambda () x))) ;; => (t (closure ((x . 0) t) nil x)) So try something like (org-agenda-bulk-custom-functions `((?P ,(lambda (&rest args) (message "test" args) (setq f-called-cnt (1+ f-called-cnt) f-called-args args)) ,(lambda () (setq arg-f-call-cnt (1+ arg-f-call-cnt)) '(1 2 3))))) or (org-agenda-bulk-custom-functions (list (list ?P (lambda (&rest args) (message "test" args) (setq f-called-cnt (1+ f-called-cnt) f-called-args args)) (lambda () (setq arg-f-call-cnt (1+ arg-f-call-cnt)) '(1 2 3)))))