Before: Save &shell, g:ale_run_synchronously let g:ale_run_synchronously = 1 if !has('win32') set shell=/bin/sh endif let g:linter_output = [] let g:first_echo_called = 0 let g:second_echo_called = 0 let g:final_callback_called = 0 function! CollectResults(buffer, output) let g:final_callback_called = 1 let g:linter_output = map(copy(a:output), 'join(split(v:val))') return [] endfunction function! RunFirstEcho(buffer) let g:first_echo_called = 1 return 'echo foo' endfunction function! RunSecondEcho(buffer, output) let g:second_echo_called = 1 return 'echo bar' endfunction call ale#linter#Define('foobar', { \ 'name': 'testlinter', \ 'callback': 'CollectResults', \ 'executable': has('win32') ? 'cmd' : 'echo', \ 'command_chain': [ \ { \ 'callback': 'RunFirstEcho', \ 'output_stream': 'stdout', \ 'read_buffer': 0, \ }, \ { \ 'callback': 'RunSecondEcho', \ 'output_stream': 'stdout', \ 'read_buffer': 0, \ }, \ ], \}) After: Restore unlet! g:first_echo_called unlet! g:second_echo_called unlet! g:final_callback_called unlet! g:linter_output let g:ale_buffer_info = {} call ale#linter#Reset() delfunction CollectResults delfunction RunFirstEcho delfunction RunSecondEcho Given foobar (Some imaginary filetype): anything Execute(Check the results of running the chain): AssertEqual 'foobar', &filetype call ale#Lint() Assert g:first_echo_called, 'The first chain item was not called' Assert g:second_echo_called, 'The second chain item was not called' Assert g:final_callback_called, 'The final callback was not called' AssertEqual ['bar'], g:linter_output