Learn to create your own mini testing library in 5 minutes
Tags: javascript, beginners, codenewbie, testing
Published: 2021-04-26 15:30:29

## Before you start
Create a `testing.js` file and run it with `node testing.js` to try your library.

This article is aimed at beginners who just started using jest and want to have a better grasp on how it works behind the scenes.

## How to create our library

If you've used jest you've probably seen the `test() - expect() - toBe()` methods.

I'm going to teach you how to build your own "mini" testing library, so you can have these methods and test your app without installing jest, just using Node.

First let's create a method we can test

```jsx
const sum = (a, b) => a + b
```

Now let's create a function to test this method

```jsx
if (sum(1, 2) !== 3) {
	console.error('Test failed. Sum function is broken!')
}
```

Now if we ever break our `sum` function our `if` statement will send an error to the console.

This works, but we want to test our other methods too and writing if statements would be repeating too much code. Remember, keep your code DRY! (Don't Repeat Yourself)

Let's turn that logic into a reusable function. We'll call it `expect` and it will return a function called `toBe`

```jsx
function expect(actual) {
	return {
		toBe(expected) {
			if (actual !== expected) {
				throw new Error('Test failed')
			}
		}
	}
}
```

Now we can test our function like this:

```jsx
expect(sum(1, 2)).toBe(3)
```

This is what we call an assertion.

If our sum function works, we'll get nothing in the console. If it's broken however, we'll get an error.

Now let's create a **test suite**! We want to test our sum function with different numbers to make sure it always works.

For this we'll create a function called `test`

```jsx
function test(title, callback) {
    try {
	callback()
	console.log(title + ' tests passed!')
    } catch(error) {
	console.error('Some tests failed!')
    }
}
```

Now we can test our sum function or any other function like this:

```jsx
test('Sum', () => {
    const result1 = sum(1, 4)
    const result2 = sum(2, -1)
    const result3 = sum(10, 10)
	
    const expected1 = 5
    const expected2 = 1
    const expected3 = 20

    expect(result1).toBe(expected1)
    expect(result2).toBe(expected2)
    expect(result3).toBe(expected3)
})
```

Now we'll get "Sum tests passed" if our function works correctly or "Some tests failed" if we break it.

## Conclusion

The idea behind this article is showing the simplicity behind some basic functionalities of testing libraries. If you understand how they're built you'll have a better time using them. If you've followed the code in this tutorial you'll probably get some ideas on how to improve it. 

You could try adding more functions like `notToBe` or `equals` 

I decided to not use newer JS syntax in this article to make it easier to understand for those starting out. 

<hr />

Find me on [twitter](https://twitter.com/jordienr) 

I'm also working on a website & newsletter with resources, tools and cool stuff for frontend developers, you can find it here: https://zerotofrontend.dev/ it's currently on "soft launch" mode and I haven't started sending the letters yet. Subscribe now to get the first one in May!