我是AngularJs / NodeJs世界的新手,所以请原谅,如果这是一个基本问题。
简而言之,我有两个控制器,第一个控制器$broadcast
和'Id',第二个控制器用$on
获取该Id,然后将该Id传递给中间{{1} },进行service
ajax调用并返回单个$http
对象。
如何使用Jasmine
单元测试$ scope.broadcast,$ scope。$Book
.controller('firstCtrl', function($scope, ...){
$scope.selectGridRow = function() {
if($scope.selectedRows[0].total !=0)
$scope.$broadcast('id', $scope.selectedRows[0].id);//Just single plain ID
};
});
.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
谢谢大家!
答案 0 :(得分:1)
首先,您应该在$rootScope
进行广播,然后您就可以在$scope
上收到广播。
现在进行测试。我假设您希望通过bookService
和$http
向您的API添加实际请求。这可以被嘲笑,但我会专注于真正的电话。如果你需要嘲笑的话,请告诉我。
在实际测试之前,您需要进行一些注射/实例化:
$controller
,$rootScope
,$httpBackend
和bookService
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);
});
});
});