Question

I'm not sure if I'm writing the title correct, but here's what I want to do.

I have this code

    var callback = function(result) {
        if(result.count < 5) {
            msg_id = result.msg_id;
            MovieService.getMovies(msg_id, result.count).get(callback, error);
        }

        if(result.movies.length !== 0) {
            setDataToDisplay(result);
        }

        if(result.count === 5) {
            $scope.loading = false;
        }
    }

    MovieService.getMovies(msg_id, 0).get(callback, error);

Basically, when user comes in the first time MovieService will be called and it gets called until the count equals to 5 times. It's like a recursive loop. Now if I want to test this code, I don't know how to do chained stub in Jasmine. I could do something similar in Mockito.

Here's my test so far.

it("should give me the lot of movies", function() {
    var movie1 = new MovieBuilder().withTweetId('8').build();
    var movie2 = new MovieBuilder().withId('3812').withTweetId('8').build();
    var movie3 = new MovieBuilder().withId('3813').withTweetId('8').build();
    var movie4 = new MovieBuilder().withId('3814').withTweetId('8').build();


    movieService = {
        getMovies : function() {
            return { 
                get : function(callback, error) {
                    callback(
                    {
                        'msg_id' : '8',
                        'count' : '5',
                        'movies' : [movie1, movie2, movie3, movie4]
                    });
                }
            }
        }
    }

    ctrl = controller('MovieTwitterCtrl', {$scope : scope, MovieService : movieService});

    expect(scope.movie_groups[0].length).toBe(4);
    expect(scope.msg_id).toBe('8');
});

But if I want to test the second, third, fourth and fifth call. How do I do that? Does Jasmine offer something like Mockito? Or how do I do that in pure javascript?

Thanks a lot.

Was it helpful?

Solution

You might want to take a look at Sinon, which is a library that provides methods for spys, stubs and mocks and is compatible with Jasmine.

In order to automatically invoke your callbacks, you would use stub.yields() or stub.yieldsTo(). You've also got spy.getCall(n) that will let you verify the way your method was called during the nth time. Sinon is written in a way that stubs are also spies... so if you create a stub for your movieService, you'll have access to both yields() and getCall(n).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top