如何使用Jasmine对$ scope.broadcast,$ scope。$进行单元测试

时间:2014-08-07 11:12:00

标签: javascript node.js angularjs karma-jasmine

我是AngularJs / NodeJs世界的新手,所以请原谅,如果这是一个基本问题。

简而言之,我有两个控制器,第一个控制器$broadcast和'Id',第二个控制器用$on获取该Id,然后将该Id传递给中间{{1} },进行service ajax调用并返回单个$http对象。

如何使用Jasmine

单元测试$ scope.broadcast,$ scope。$

firstCtrl

Book

secondCtrl

.controller('firstCtrl', function($scope, ...){
    $scope.selectGridRow = function() {
        if($scope.selectedRows[0].total !=0)
            $scope.$broadcast('id', $scope.selectedRows[0].id);//Just single plain ID
    };
});

期待Json obj

.controller('secondCtrl',
    function($scope, bookService) {
        $scope.$on('id', function(event, id) {
            bookService.getBookDetail(id).then(function(d) {
                $scope.book = d.book;
            });
        });
    });

如果有人要我发布第二个控制器使用的var arr = "book" : [ { "id" : "1", "name" : "Tomcat", "edition" : "9.1" } ] 服务,请告诉我。

预期行为

所以从头脑中,理想情况下,我想测试每一种可能的情况,但是下面会发生这种情况,然后可以花费:

$http

谢谢大家!

1 个答案:

答案 0 :(得分:1)

首先,您应该在$rootScope进行广播,然后您就可以在$scope上收到广播。 现在进行测试。我假设您希望通过bookService$http向您的API添加实际请求。这可以被嘲笑,但我会专注于真正的电话。如果你需要嘲笑的话,请告诉我。

在实际测试之前,您需要进行一些注射/实例化:

  • 初始化您的应用
  • 注入$controller$rootScope$httpBackendbookService
  • 为firstController和SecondController创建范围并将其存储在变量
  • bookService$httpBackend存储在变量
  • 实例化控制器并存储它们

然后在实际测试中,您必须告诉$httpBackend在缓存书籍(或书籍)请求时该怎么做。构造$httpBackend.whenGET("/api/books/1").passThrough();会将带有URL "/api/books/1"的请求传递给服务器。 接下来,您必须在selectedRows设置属性firstScope,以便它符合selectGridRow中功能firstCtrl中的条件。

现在您可以调用函数selectGridRow来触发广播和API调用。但是你必须将它包装在runs函数中,以便Jasmine将其识别为异步调用并等待它完成。等待'在waitsFor调用中定义。它将等到它拿到一本书并且它等待最多5000毫秒然后测试将被标记为失败。

最后一步是检查预期结果。我们不再需要检查undefined,因为无论如何测试都不会到达此处。该支票必须再次打包runs,以便在成功后执行'等待'。

以下是完整代码:

describe("Broadcast between controllers", function () {

    beforeEach(module('app')); //app initialization

    var firstScope;
    var secondScope;

    var bookService;
    var $httpBackend;

    var firstController;
    var secondController;

    beforeEach(inject(function ($controller, $rootScope, _bookService_, _$httpBackend_) {
        firstScope = $rootScope.$new();
        secondScope = $rootScope.$new();

        bookService = _bookService_;
        $httpBackend = _$httpBackend_;

        firstController = $controller('firstCtrl', { $scope: firstScope });
        secondController = $controller('secondCtrl', { $scope: firstScope, bookService: bookService });
    }));


    it("should work", function () {

        $httpBackend.whenGET("/api/books/1").passThrough();

        firstScope.selectedRows = [{ id: 1, total: 1000 }];
        secondScope.book = null;

        runs(function () {
            firstScope.selectGridRow();
        });

        waitsFor(function () {
            return secondScope.book != null;
        }, "Data not received in expected time", 5000);

        runs(function () {
            expect(secondScope.book[0].id).toEqual(1);
        });
    });

});