All Projects β†’ nadeesha β†’ Saul

nadeesha / Saul

Experimental annotation-based javascript unit tests πŸš€

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Saul

Simplestubs
*SimpleStubs* is a simple mocking framework that supports Universal Windows Platform (UWP), .NET Core and .NET framework. SimpleStubs is currently developed and maintained by Microsoft BigPark Studios in Vancouver.
Stars: ✭ 66 (-26.67%)
Mutual labels:  unit-testing
Semaphore Ng2 Webpack
Stars: ✭ 81 (-10%)
Mutual labels:  unit-testing
Vest
Vest βœ… Declarative validations framework
Stars: ✭ 1,271 (+1312.22%)
Mutual labels:  unit-testing
Aunit
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test. Used with AUniter or EpoxyDuino for continuous builds.
Stars: ✭ 73 (-18.89%)
Mutual labels:  unit-testing
Go Script Bash
Framework for writing modular, discoverable, testable Bash scripts
Stars: ✭ 77 (-14.44%)
Mutual labels:  unit-testing
Sequelize Test Helpers
A collection of utilities to help with unit-testing Sequelize models
Stars: ✭ 83 (-7.78%)
Mutual labels:  unit-testing
Redux Saga Test Plan
Test Redux Saga with an easy plan.
Stars: ✭ 1,135 (+1161.11%)
Mutual labels:  unit-testing
Netdumbster
netDumbster is a .Net Fake SMTP Server clone of the popular Dumbster
Stars: ✭ 88 (-2.22%)
Mutual labels:  unit-testing
Aspnetcorespa
Asp.Net 5.0 & Angular 11 SPA Fullstack application with plenty of examples. Live demo:
Stars: ✭ 1,211 (+1245.56%)
Mutual labels:  unit-testing
Autoparams
Arbitrary test data generator for parameterized tests in Java inspired by AutoFixture.
Stars: ✭ 77 (-14.44%)
Mutual labels:  unit-testing
Memote
memote – the genome-scale metabolic model test suite
Stars: ✭ 73 (-18.89%)
Mutual labels:  unit-testing
Tcunit
An unit testing framework for Beckhoff's TwinCAT 3
Stars: ✭ 74 (-17.78%)
Mutual labels:  unit-testing
Android Mvp Architecture
MVP + Kotlin + Retrofit2 + Dagger2 + Coroutines + Anko + Kotlin-Android-Extensions + RX-java + Mockk + Espresso + Junit5
Stars: ✭ 82 (-8.89%)
Mutual labels:  unit-testing
Publish Unit Test Result Action
GitHub Action to publish unit test results on GitHub
Stars: ✭ 71 (-21.11%)
Mutual labels:  unit-testing
Testing Workshop
A workshop for learning how to test JavaScript applications
Stars: ✭ 1,276 (+1317.78%)
Mutual labels:  unit-testing
C koans
C Koans
Stars: ✭ 65 (-27.78%)
Mutual labels:  unit-testing
Sample Code Movies
This repository contains sample code. Its purpose being, to quickly demonstrate Android and software development in general, clean code, best practices, testing and all those other must know goodies.
Stars: ✭ 81 (-10%)
Mutual labels:  unit-testing
Bitsofbytes
Code and projects from my blog posts.
Stars: ✭ 89 (-1.11%)
Mutual labels:  unit-testing
Rubberduck
Every programmer needs a rubberduck. COM add-in for the VBA & VB6 IDE (VBE).
Stars: ✭ 1,287 (+1330%)
Mutual labels:  unit-testing
Jasmine Marbles
Marble testing helpers for RxJS and Jasmine
Stars: ✭ 85 (-5.56%)
Mutual labels:  unit-testing

Build Status npm version

Saul - Introduction

Demo

What is it?

saul gives you a custom DSL that will help you write test framework agnostic unit tests for your javascript functions.

A simple example might look like:

// @t "should call saul when the threat is imminent"        shouldCallSaul('imminent') ~equals true
// @t "should not call saul when threat is not imminent"    shouldCallSaul('nodanger') ~equals false
function shouldCallSaul(threatLevel) {
    if (threatLevel === 'imminent') {
        return true;
    }

    return false;
}

What problems does it solve?

  • Avoid writing unnecessary boilerplate code for trivial tests
  • Quickly test functionality with // @t annotations in your code
  • Have your tests co-located to the functionality it tests
  • Self-document your functionality with a custom DSL

Installation

1. Install saul as a dev dependency:

yarn add --dev saul

2. Create a .saulrc in the root.

example:

{
    "fileGlob": "src/**/*.js",                      // files that contain the saul comments
    "customEnginesDir": "./src/custom-saul-engines" // optional: dir where you will put custom engine .js files
}

3. Invoke saul from your test.

Mocha/Jasmine

If you have some mocha tests already, your npm test would look like: mocha src/**/.js. Simple add saul's bin (node_modules/.bin/saul) right at the end:

mocha lib/*.test.js" node_modules/.bin/saul

Jest

Since jest requires a regex pattern for test files, you will have to create a file with a single file with a require, that will be matched by your jest regexPattern.

Example:

require('saul'); // will run all saul tests here

Usage with Babel

Any transformation that you apply to your tests will be inherited by saul when you run your tests. If you're running babel, this will include anything that you define in your local .babelrc.

For an instance, if you want to feed babel-transformed files to mocha, you will invoke mocha with mocha --compilers js:babel-register. You can simply add saul to the end of the command. (mocha --compilers js:babel-register node_modules/.bin/saul) - and things will Just Workβ„’.

DSL Specification and Examples

expect

Assert the result using chai's expect. Comes with test spy support from sinon.

Example:

// @t "appends foo" appendFoo('bar') ~expect expect(result).to.contain('foo');
// @t "has no fizz" appendFoo('bar') ~expect expect(result).to.not.contain('fizz');
export function appendFoo (someString) {
    return someString + 'foo';
}

With spy support:

Calling spy(name: string), will create a sinon spy. You can assert on any of it's methods/properties like this:

// @t "calls only once"   testEvalSpy(spy('mySpy')) ~expect spy('mySpy').calledOnce
// @t "calls with obj"    testEvalSpy(spy('mySpy2'), 'foo') ~expect spy('mySpy2').calledWith('foo')
export function testEvalSpy (fn, str) {
  fn('foo', str);
}

matches-snapshot

Checks whether a previously saved snapshot image of the function's serialized output, matches the current output. (Saves a snapshot file on the first run - that should be checked in to the repo).

// @t "should render Date" Date({dateString: '1970-03-11'}) ~matches-snapshot
export function Date(props) {
    return <div className={'mydate'}>{props.dateString}</div>
}

// @t "returns all months" getAllMonths() ~matches-snapshot
export function getAllMonths() {
    return CONSTANTS.ALL_MONTHS.join('_');
}

equals

Checks whether the expected value is equal to the actual value. If the function returns a promise, resolves it before asserting

// @t "can sum" sum(1, 2) ~equals 3
export function sum(numOne, numTwo) {
    return numOne + numTwo;
}

// @t "testEqualsAsync" testEqualsAsync() ~equals 'foo'
export function testEqualsAsync() {
  return new Promise((resolve, reject) => {
    resolve('foo');
  });
}

contains

Checks whether the output contains the expected value.

Example:

// @t "can concat" concatanate('string1', 'something els') ~contains 'string1'
export function concatanate (a, b) {
    return a + b;
}

is-not

Checks whether the expected value is not equal to the actual value. (Opposite of equals)

// @t "can sum" sum(1, 2) ~is-not 4
export function sum(numOne, numTwo) {
    return numOne + numTwo;
}

throws

Checks whether the invokation would throw.

// @t "throws on null engine" executeTest({engine: null}) ~throws Error
export executeTest(options) {
    options.engine('foobar');
}

And more! See: extending saul.

Extending saul

Then engines are the "comparator" in the tests.

// @t "throws on null engine" executeTest({engine: null}) ~throws Error
                                      |                      |      β”” expected value
                                      |                      |
                                      |                      β”” comparator
                                      |
                                      β”” actutal value

They are handled by the file of that name in src/engines/. (Example: src/engines/throws.js)

The "engines", are responsible for generating the tests. So, as long as you build a custom engine - it can pretty much test anything.

The default engines can do a few cool things out of the box. (check the src/engines/ directory). You can always write your own engines and put them in your customEnginesDir defined in .saulrc.

Examples

Just look through this repo for // @t annotated tests. saul is tested with saul! πŸš€

Contributions

Please! Here are som TODOs that need being done.

  • [ ] More engines! (If you would like to contribute an engine, please take a look at the engine files at src/engines)
  • [ ] Documentation on writing engines.
  • [ ] Extending the parsers for fixtures
  • [x] Better error handling for engines
  • [x] Tests for existing engines
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].