This plugin provides an RSpec adapter for the Neotest framework.
Install with the package manager of your choice:
Lazy
{
"nvim-neotest/neotest",
lazy = true,
dependencies = {
...,
"olimorris/neotest-rspec",
},
config = function()
require("neotest").setup({
...,
adapters = {
require("neotest-rspec")
},
})
end
}
Packer
use({
"nvim-neotest/neotest",
requires = {
...,
"olimorris/neotest-rspec",
},
config = function()
require("neotest").setup({
...,
adapters = {
require("neotest-rspec"),
}
})
end
})
Note
You only need to the call the setup
function if you wish to change any of the defaults
Click to see the default configuration
adapters = {
require("neotest-rspec")({
rspec_cmd = function()
return vim.tbl_flatten({
"bundle",
"exec",
"rspec",
})
end,
root_files = { "Gemfile", ".rspec", ".gitignore" },
filter_dirs = { ".git", "node_modules" },
transform_spec_path = function(path)
return path
end,
results_path = function()
return async.fn.tempname()
end
}),
}
The command used to run tests can be changed via the rspec_cmd
option:
require("neotest-rspec")({
rspec_cmd = function()
return vim.tbl_flatten({
"bundle",
"exec",
"rspec",
})
end
})
For Neotest adapters to work, they need to define a project root whereby the process of discovering tests can take place. By default, the adapter looks for a Gemfile
, .rspec
or .gitignore
file. These can be changed with:
require("neotest-rspec")({
root_files = { "README.md" }
})
You can even set root_files
with a function which returns a table:
require("neotest-rspec")({
root_files = function() return { "README.md" } end
})
By default, the adapter will search for _spec.rb
files in all dirs in the root with the exception of node_modules
and .git
. You can change this with:
require("neotest-rspec")({
filter_dirs = { "my_custom_dir" }
})
You can even set filter_dirs
with a function which returns a table:
require("neotest-rspec")({
filter_dirs = function() return { "my_custom_dir" } end
})
The following configuration overrides rspec_cmd
to run a Docker container (using docker-compose
) and overrides transform_spec_path
to pass the spec file as a relative path instead of an absolute path to RSpec. The results_path
needs to be set to a location which is available to both the container and the host.
require("neotest").setup({
adapters = {
require("neotest-rspec")({
rspec_cmd = function()
return vim.tbl_flatten({
"docker",
"compose",
"exec",
"-i",
"-w", "/app",
"-e", "RAILS_ENV=test",
"app",
"bundle",
"exec",
"rspec"
})
end,
transform_spec_path = function(path)
local prefix = require('neotest-rspec').root(path)
return string.sub(path, string.len(prefix) + 2, -1)
end,
results_path = "tmp/rspec.output"
})
}
})
Alternatively, you can accomplish this using a shell script as your RSpec command. See this comment for an example.
Important
In order for the adapter to work, your RSpec tests must end in _spec.rb
To test a single test, hover over the test and run require("neotest").run.run()
To test a file run require("neotest").run.run(vim.fn.expand("%"))
To test a directory run require("neotest").run.run("path/to/directory")
To test the full test suite run require("neotest").run.run("path/to/root_project")
e.g. require("neotest").run.run(vim.fn.getcwd())
, presuming that vim's directory is the same as the project root.
This project is maintained by the Neovim Ruby community. Please raise a PR if you are interested in adding new functionality or fixing any bugs. When submitting a bug, please include an example spec that can be tested.
To trigger the tests for the adapter, run:
make test