如何使用$ interval.flush和clock.tick使用Sinon测试更新$ scope

时间:2018-01-09 04:56:18

标签: angularjs testing mocking sinon chai

所以,我有一个有问题的示例代码的plunker设置: http://plnkr.co/edit/KcpzxTnwFNnvhYXyPq6B?p=preview

我的问题是,我在home.controller.js中有一个函数

                 extension=php_openssl.dll
                 extension=php_sockets.dll

触发后,预计每5000毫秒调用一次PopularMovies.query(function(data) { results = data; findMovie(results[0]); console.log("$interval Start", Date.now()); $interval(function() { ++idx; console.log("$interval idx[" + idx + "]", Date.now()); console.log("results[idx % results.length]", results[idx % results.length]); findMovie(results[idx % results.length]); }, 5000); });

为了测试这个,我在home.controller.spec.js文件中编写了一个测试:

findMovie()

我的期望是it('should rotate movies every 5 seconds', function() { this.clock = sinon.useFakeTimers(); var myStub = sinon.stub(PopularMovies, 'query').callsFake(function(cb) { cb(['tt0076759', 'tt0080684', 'tt0086190']); }); $controller('HomeController', { $scope: $scope, $interval: $interval, omdbApi: omdbApi, PopularMovies: PopularMovies }); $rootScope.$apply(); // should have a default movie console.log("$scope", $scope); console.log("$scope.result", $scope.result); console.log("results[0].Title", results[0].Title); expect($scope.result.Title).to.equal(results[0].Title); // should update after 5 seconds console.log(Date.now(), this.clock); this.clock.tick(5000); $interval.flush(5000); console.log(Date.now(), this.clock); console.log("$scope", $scope); console.log("$scope.result", $scope.result); console.log("results[1].Title", results[1].Title); expect($scope.result.Title).to.equal(results[1].Title); // should update after 5 seconds this.clock.tick(5000); $interval.flush(5000); console.log("$scope", $scope); console.log("$scope.result", $scope.result); console.log("results[2].Title", results[2].Title); expect($scope.result.Title).to.equal(results[2].Title); // should return to default this.clock.tick(5000); $interval.flush(5000); expect($scope.result.Title).to.equal(results[0].Title); this.clock.restore(); }); 和/或this.clock.tick(5000);会增加计时器,而angular会更新$ scope.result。

在第一次调用时,$ scope更新。但是,任何后续计时器都无法从spec文件更新$ scope。

我在使用Jasmine之前已经编写了一次这些测试,我对$ scope更新没有任何问题。但是,我正试图过渡到Sinon,所以请帮我搞定!

1 个答案:

答案 0 :(得分:0)

原来我遇到的问题是omdb.find服务的存根,并从Jasmine的Object.fn.calls.mostRecent()转换为Sinon的Object.fn.args,这不是没有问题的。有moreRecent()函数。我更改了代码以查看args数组中的最后一个arg。

在home.controller.spec.js中,我改变了

var args = _omdbApi_.find.args[0][0];

var args = _omdbApi_.find.args;
args = args[args.length - 1][0];

工作代码: https://www.postgresql.org/docs/10/static/sql-cluster.html