Creating Tests for Octo
Luigi Zaccagnini
Posted on November 17, 2021
Hello! Welcome to another blog post about my open source project Octo. If you're new to my blogs, Octo is an open source static site generation tool created by me! Today I am going to review the process of writing tests and explain how I implemented them in my project.
What Framework to Use?
The framework I picked for my project was Jest. I picked Jest because it is the framework I am most comfortable with and it is very easy to setup in your project!
Jest Setup
To add Jest to your project, run yarn add --dev jest
or npm install --save-dev jest
. Once Jest is installed, open your package.json
and create a new npm script "test":"jest"
. Now whenever you want to run your tests all you need to do is run npm test
. I strongly recommend storing all of your test files in your root directory in a test folder. It will help keep your project nice and organized.
Writing Tests
Everything up until this point was simple for me. Once I started writing tests I ran into a bunch of errors that confused me. Good thing I ran into those so you can now learn from my mistakes! To start off, create a file in the format of myFileThatNeedsTesting.test.js
. Once done, open the file and add /* eslint-disable no-undef */
at the top. If you do not do this, eslint will think you're making a bunch of errors and might make you a little confused.
Writing a Matchers
test('Checks if it can add a directory', () => {
expect(ff.addDirectory('./dist')).toBeUndefined();
});
A matcher is a test that checks its value to see if it is correct. As you can see above, I created a test to check if my addDirectory
function would return undefined. I check for undefined because the addDirectory
function will only return errors. So if I do get anything, there is a problem. This is a very basic matcher but, if you're interested in more matcher options check here.
Snapshots
it('Markdown to HTML renders correctly', () => {
ff.markdownToHTML('test/markdownTest.md').then(html => {
const tree = ReactTestRenderer
.create(html)
.toJSON();
expect(tree).toMatchSnapshot();
});
});
Snapshot testing was my favourite part! I found it really useful to compare test render code with the correct code. Above I use my markdownToHTML
function to convert a markdown file and then make sure, it matched the snapshot. At first I was having problems with this because my functions could not find the file. I eventually figured out that I need to path from the root of my project. Once I had that working, the file was correctly displaying the correct information.
Generating a Coverage Report
Generating a coverage report is very simple and gives you a lot of information about how and where you can write more tests for your code. To generate the report use yarn test --coverage
. After running that command you should see a folder with all the information.
Conclusion
Setting up tests for my code was a very fun process. It taught me the importance of testing code as well as a different approach on how to write code. I have attempted to write tests for code before but would always get stuck. Now that I finally have learned how to write tests properly, I will continue to write tests for future projects and encourage others to do the same!
Posted on November 17, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.