Before: call ale#assert#SetUpLinterTest('php', 'psalm') After: unlet! g:i unlet! g:matched if isdirectory(g:dir . '/.git') call delete(g:dir . '/.git', 'd') endif call ale#assert#TearDownLinterTest() Execute(The default executable path should be correct): AssertLinter 'psalm', \ ale#Escape('psalm') . ' --language-server' Execute(Vendor executables should be detected): call ale#test#SetFilename('../test-files/psalm/test.php') AssertLinter \ ale#path#Simplify(g:dir . '/../test-files/psalm/vendor/bin/psalm'), \ ale#Escape(ale#path#Simplify( \ g:dir \ . '/../test-files/psalm/vendor/bin/psalm' \ )) . ' --language-server' let g:ale_php_psalm_use_global = 1 AssertLinter 'psalm', \ ale#Escape('psalm') . ' --language-server' Execute(User provided options should be used): let g:ale_php_psalm_options = '--my-user-provided-option my-value' AssertLinter 'psalm', \ ale#Escape('psalm') \ . ' --language-server --my-user-provided-option my-value' Execute(The project path should be correct for composer.json file): call ale#test#SetFilename('../test-files/php/with-composer/test.php') AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/php/with-composer')