mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-23 22:40:04 +08:00
119 lines
3.5 KiB
Markdown
119 lines
3.5 KiB
Markdown
|
# Testing Guide
|
||
|
|
||
|
Some testing examples using Plenary.nvim
|
||
|
|
||
|
# A simple test
|
||
|
|
||
|
This tests demonstrates a **describe** block that contains two tests defined with **it** blocks, the describe block also contains a **before_each** call that gets called before each test.
|
||
|
|
||
|
```lua
|
||
|
describe("some basics", function()
|
||
|
|
||
|
local bello = function(boo)
|
||
|
return "bello " .. boo
|
||
|
end
|
||
|
|
||
|
local bounter
|
||
|
|
||
|
before_each(function()
|
||
|
bounter = 0
|
||
|
end)
|
||
|
|
||
|
it("some test", function()
|
||
|
bounter = 100
|
||
|
assert.equals("bello Brian", bello("Brian"))
|
||
|
end)
|
||
|
|
||
|
it("some other test", function()
|
||
|
assert.equals(0, bounter)
|
||
|
end)
|
||
|
end)
|
||
|
```
|
||
|
|
||
|
The test **some test** checks that a functions output is as expected based on the input. The second test **some other test** checks that the variable **bounter** is reset for each test (as defined in the before_each block).
|
||
|
|
||
|
# mocking with luassert
|
||
|
|
||
|
Plenary.nvim comes bundled with [luassert](https://github.com/Olivine-Labs/luassert) a library that's built to extend the built-int assertions... but it also comes with stubs, mocks and spies!
|
||
|
|
||
|
Sometimes it's useful to test functions that have nvim api function calls within them, take for example the following example of a simple module that creates a new buffer and opens in it in a split.
|
||
|
|
||
|
|
||
|
**module.lua**
|
||
|
```lua
|
||
|
local M = {}
|
||
|
|
||
|
function M.realistic_func()
|
||
|
local buf = vim.api.nvim_create_buf(false, true)
|
||
|
vim.api.nvim_command("sbuffer " .. buf)
|
||
|
end
|
||
|
|
||
|
return M
|
||
|
```
|
||
|
|
||
|
The following is an example of completely mocking a module, and another of just stubbing a single function within a module. In this case the module is `vim.api`, with an aim of giving an example of a unit test (fully mocked) and an integration test... details in the comments.
|
||
|
|
||
|
**module.lua**
|
||
|
```lua
|
||
|
-- import the luassert.mock module
|
||
|
local mock = require('luassert.mock')
|
||
|
local stub = require('luassert.stub')
|
||
|
|
||
|
describe("example", function()
|
||
|
-- instance of module to be tested
|
||
|
local testModule = require('example.module')
|
||
|
-- mocked instance of api to interact with
|
||
|
|
||
|
describe("realistic_func", function()
|
||
|
it("Should make expected calls to api, fully mocked", function()
|
||
|
-- mock the vim.api
|
||
|
local api = mock(vim.api, true)
|
||
|
|
||
|
-- set expectation when mocked api call made
|
||
|
api.nvim_create_buf.returns(5)
|
||
|
|
||
|
testModule.realistic_func()
|
||
|
|
||
|
-- assert api was called with expcted values
|
||
|
assert.stub(api.nvim_create_buf).was_called_with(false, true)
|
||
|
-- assert api was called with set expectation
|
||
|
assert.stub(api.nvim_command).was_called_with("sbuffer 5")
|
||
|
|
||
|
-- revert api back to it's former glory
|
||
|
mock.revert(api)
|
||
|
end)
|
||
|
|
||
|
it("Should mock single api call", function()
|
||
|
-- capture some number of windows and buffers before
|
||
|
-- running our function
|
||
|
local buf_count = #vim.api.nvim_list_bufs()
|
||
|
local win_count = #vim.api.nvim_list_wins()
|
||
|
-- stub a single function in the api
|
||
|
stub(vim.api, "nvim_command")
|
||
|
|
||
|
testModule.realistic_func()
|
||
|
|
||
|
-- capture some details after running out function
|
||
|
local after_buf_count = #vim.api.nvim_list_bufs()
|
||
|
local after_win_count = #vim.api.nvim_list_wins()
|
||
|
|
||
|
-- why 3 not two? NO IDEA! The point is we mocked
|
||
|
-- nvim_commad and there is only a single window
|
||
|
assert.equals(3, buf_count)
|
||
|
assert.equals(4, after_buf_count)
|
||
|
|
||
|
-- WOOPIE!
|
||
|
assert.equals(1, win_count)
|
||
|
assert.equals(1, after_win_count)
|
||
|
end)
|
||
|
end)
|
||
|
end)
|
||
|
```
|
||
|
|
||
|
To test this in your `~/.config/nvim` configuration, try the suggested file structure:
|
||
|
|
||
|
```
|
||
|
lua/example/module.lua
|
||
|
lua/spec/example/module_spec.lua
|
||
|
```
|