branch: elpa/buttercup commit 8aa87c89eb93474ef784664d5404fec5c9c31c71 Author: Jorgen Schaefer <cont...@jorgenschaefer.de> Commit: Jorgen Schaefer <cont...@jorgenschaefer.de>
Spy :and-call-through --- README.md | 26 ++++++++++++++++++++++++++ buttercup-test.el | 14 ++++++++++++++ buttercup.el | 15 +++++++++++---- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 20062db..34a56a2 100644 --- a/README.md +++ b/README.md @@ -344,6 +344,32 @@ the argument list matches any of the recorded calls to the spy. (expect bar :to-be nil)))) ``` +### Spies: `:and-call-through` + +The keyword argument `:and-call-through` to `spy-on` will make the spy +call the original function instead of returning `nil`. + +```Lisp +(describe "A spy, when configured to call through" + (let (bar set-bar get-bar fetched-bar) + (before-each + (fset 'set-bar (lambda (val) + (setq bar val))) + (fset 'get-bar (lambda () + bar)) + + (spy-on 'get-bar :and-call-through) + + (set-bar 123) + (setq fetched-bar (get-bar))) + + (it "tracks that the spy was called" + (expect 'get-bar :to-have-been-called)) + + (it "should not affect other functions" + (expect bar :to-equal 123)))) +``` + ## Test Runners Evaluating `describe` forms just stores the suites. You need to use a diff --git a/buttercup-test.el b/buttercup-test.el index cb071c4..bb30b9c 100644 --- a/buttercup-test.el +++ b/buttercup-test.el @@ -377,3 +377,17 @@ :to-have-been-called-with '(test-function 1 2 3)) :to-be t))) + +(describe "The :and-call-through keyword functionality" + (before-each + (spy-on 'test-function :and-call-through)) + + (it "tracks calls to the function" + (test-function 42 23) + + (expect 'test-function :to-have-been-called)) + + (it "passes the arguments to the original function" + (expect (test-function 2 3) + :to-equal + 5))) diff --git a/buttercup.el b/buttercup.el index 87c6d7f..916dbc8 100644 --- a/buttercup.el +++ b/buttercup.el @@ -368,11 +368,18 @@ A disabled spec is not run." (defvar buttercup--spy-calls (make-hash-table :test 'eq :weakness 'key)) -(defun spy-on (symbol) - (letrec ((old-value (symbol-function symbol)) - (new-value (lambda (&rest args) +(defun spy-on (symbol &rest keyword-args) + (let ((old-value (symbol-function symbol)) + (new-value nil)) + (cond + ((equal keyword-args '(:and-call-through)) + (setq new-value (lambda (&rest args) (buttercup--spy-add-call new-value args) - nil))) + (apply old-value args)))) + ((equal keyword-args nil) + (setq new-value (lambda (&rest args) + (buttercup--spy-add-call new-value args) + nil)))) (fset symbol new-value) (buttercup--add-cleanup (lambda () (fset symbol old-value)))))