0

我不确定我写的标题是否正确,但这就是我想要做的。

我有这个代码

    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);

基本上,当用户第一次进来时,MovieService 将被调用并被调用,直到count等于 5 次。这就像一个递归循环。现在如果我想测试这段代码,我不知道如何在 Jasmine 中进行链式存根。我可以在 Mockito 中做类似的事情。

到目前为止,这是我的测试。

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');
});

但是如果我想测试第二个、第三个、第四个和第五个调用。我怎么做?Jasmine 是否提供类似 Mockito 的产品?或者我如何在纯javascript中做到这一点?

非常感谢。

4

1 回答 1

1

你可能想看看Sinon,它是一个为 spys、stubs 和 mocks 提供方法并且与 Jasmine 兼容的库。

为了自动调用你的回调,你可以使用stub.yields()or stub.yieldsTo()。您还可以spy.getCall(n)使用它来验证您的方法在n第 th 时间被调用的方式。Sinon 的编写方式是存根也是间谍......所以如果你为你的电影服务创建一个存根,你将可以同时访问yields()getCall(n)

于 2013-08-06T16:47:06.530 回答