Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jasmine Spies.and.stub method

I've been reading through the Jasmine documentation and I've been struggling to understand what the Spies .and.stub method actually does. English is not my native language, so I don't even know what the word "stub" actually means, and there is no translation for it in my language.

In the documentation it says:

When a calling strategy is used for a spy, the original stubbing behavior can be returned at any time with and.stub.

describe("A spy", function() {    var foo, bar = null;    beforeEach(function() {     foo = {       setBar: function(value) {         bar = value;       }     };      spyOn(foo, 'setBar').and.callThrough();   });    it("can call through and then stub in the same spec", function() {     foo.setBar(123);     expect(bar).toEqual(123);      foo.setBar.and.stub();     bar = null;      foo.setBar(123);     expect(bar).toBe(null);   }); }); 

What does and.stub actually do and how is it useful?

like image 593
Ratko Avatar asked Jan 18 '15 10:01

Ratko


People also ask

What is a stub in Jasmine?

We have already seen some use cases for Jasmine spies. Remember that a spy is a special function that records how it was called. You can think of a stub as a spy with behavior. We use stubs whenever we want to force a specific path in our specs or replace a real implementation for a simpler one.

How do you spy on Jasmine method?

There are two ways to create a spy in Jasmine: spyOn() can only be used when the method already exists on the object, whereas jasmine. createSpy() will return a brand new function: //spyOn(object, methodName) where object. method() is a function spyOn(obj, 'myMethod') //jasmine.

What is spying and stubbing?

It means spy creates a partial object or a half dummy of the real object by stubbing or spying the real ones. In spying, the real object remains unchanged, and we just spy some specific methods of it. In other words, we take the existing (real) object and replace or spy only some of its methods.

How do you make a Jasmine stub?

There are no stubs in Jasmine, because there is no need to. The dynamic nature of JavaScript allows us to change the implementation of a JavaScript function on the fly. We can also stub functions using spies.


2 Answers

For the term, you can look at wikipedia : http://en.wikipedia.org/wiki/Test_stub

In a nutshell it's a "fake" object that you can control that replaces a "real" object in your code.

For the function, what I understand is that and.stub() removes the effect of and.callThrough() on a spy.

When you call and.callThrough, the spy acts as a proxy, calling the real function, but passing through a spy object allowing you to add tests like expectation.

When you call and.stub, or if you never call and.callThrough, the spy won't call the real function. It's really usefull when you don't want to test an object's behavior, but be sure that it was called. Helping you to keep your test truly unitary.

like image 56
Boris Charpentier Avatar answered Sep 24 '22 06:09

Boris Charpentier


To complete the previous answer:

Indeed, it's not clear from the doc, but it's very clear in the source code:

https://github.com/jasmine/jasmine/blob/4be20794827a63ca5295848c58ffc478624ee4dc/src/core/SpyStrategy.js

plan = function() {}; 

-> the called function is empty

this.callThrough = function() {   plan = originalFn; 

-> the called function is the original function

this.stub = function(fn) {   plan = function() {}; 

-> the called function is empty (again)

like image 39
pansay Avatar answered Sep 21 '22 06:09

pansay