Scenario Based Tests in Jasmine.js

Scenario Based Tests in Jasmine.js

To start with jasmine, let me tell you about jasmine and what it do.

What is Jasmine?

Jasmine is a behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests. This guide is running against Jasmine version 2.4.1.

That was brief introduction of jasmine which you can also get on their website. Writing test in jasmine is not very difficult. Every test suite start with a function called ‘describe’ which takes two input.

  1. A string which is description of test case.
  2. A function is method or block of code which implements suite.

Second block of test is ‘it’ block. ‘it’ take same inputs as ‘describe’, a string and a function. A simple jasmine test is shown below.

describe('Check Addition Result', function () {
    it('adds two numbers together', function () {
        expect(1 + 5).toEqual(6);
    });
});

Here arguments of ‘expect’ will be output of function to be tested, and ‘toEqual’ will have expected result as argument.

Getting Started

Download latest standalone release from standalone download page of Jasmine. This will look like this

Capture2

Open ‘SpecRunner’ in browser and you will look something like this.

Capture3

Now add following function in ‘src/Player.js’ file.

function evenOrOdd(input){
    if(isNaN(input)){
	return -1;
    }
    else{
	return parseInt(input)%2==0;
    }
}	

Now we will add tests for this function. Add following code in spec/PlayerSpec.js.

describe('Function: evenOrOdd()', function(){
	it('Input is an even number', function(){
		var result = evenOrOdd(4);
		expect(result).toBe(true);
	});
	it('Input is a string', function(){
		var result = evenOrOdd('string');
		expect(result).toBe(-1);
	});
	it('Input is a number in string', function(){
		var result = evenOrOdd('4');
		expect(result).toBe(true);
	});
	it('Input is an odd number', function(){
		var result = evenOrOdd(5);
		expect(result).toBe(false);
	});
		
});

You will see result of your new tests like this when you will open ‘SpecRunner.html’ in browser.

Capture123.PNG

You can see that we have to repeat same ‘it’ block again and again. The only thing which is changing is description of test, input of function and expected output of function. Here we can use scenarios to avoid repetition of code.

Scenarios In Jasmine tests

Write your scenarios like this

var scenarios = [
		{
		description: 'Input is an even number',
		input: 4,
		expected_output: true
		},
		{
		description: 'Input is a string',
		input: 'string',
		expected_output: -1
		},
		{
		description: 'Input is a number in string',
		input: '4',
		expected_output: true
		},
		{
		description: 'Input is an odd number',
		input: 5,
		expected_output: false
		},
	];	

You can see that we just make a separate object for every test case and write all required data for a test in it. Now change your test like this

scenarios.map(function(value){
	it(value.description, function(){
	    var result = evenOrOdd(value.input);
	    expect(result).toBe(value.expected_output);
        });
});

Now when you will run your tests, you will see same output as before. This is how we can use scenarios to avoid repetition of code in our tests.

Conclusion

You can do a lot more with Jasmine like function related-matchers, spies and many more things.You can check detailed documentation from here. Jasmine can be used to test JavaScript code in you Django, Flask or Ruby project.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s