navigator.webkitGetUserMedia 用 Karma/Jasmine 打破单元测试
navigator.webkitGetUserMedia breaks unitTests with Karma/Jasmine
我得到了一个 AngularJS WebApp,我用 Karma 和 Jasmine.js
测试了它
但是如果我在我的控制器中使用 navigator.webkitGetUserMedia() 它会抛出一个错误。
TypeError: 'undefined' is not a function (evaluating 'navigator.webkitGetUserMedia')
这是我的控制器示例
app.controller('appCtrl', function ($scope, $interval, $location, globVal, loginService) {
navigator.webkitGetUserMedia({video: true, audio: false},
function (stream) {
globVal.webcam = window.URL.createObjectURL(stream);
},
function (err) {
console.log("error happened:" + err);
}
);
$scope.startTimeout = $interval(function () {
// do something
}, 2000);
});
我的测试规格
'use strict';
describe("控制器:appCtrl", function () {
变量 $rootScope,
$范围,
控制器,
全局值,
位置;
beforeEach(function () {
module('myModul');
globVal = {
customer: {why: 'idle'},
goHome: 1,
goHomeCounter:1
};
module(function ($provide) {
$provide.value('globVal', globVal);
});
inject(function ($injector, $location) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $injector.get('$controller')("appCtrl", {$scope: $scope});
location = $location;
});
});
describe("init", function () {
it('Should init', function () {
expect($scope).toBeDefined();
});
});
describe("globVal idle", function () {
it('should globVal be idle', function () {
expect(globVal.customer.why).toBe('idle');
});
});
describe("startTimeout", function () {
it('Should have method startTimeout ', function () {
expect($scope.startTimeout).toBeDefined();
});
});
我应该如何模拟导航器对象?
使用 spyOn(navigator, 'webkitGetUserMedia');
如果这不起作用,只需创建您自己的 webkitGetUserMedia 函数作为测试规范中导航器对象的一部分。
您可以在 beforeEach 或 it("should ...") 函数中注入 $window 并替换 $window 中的整个导航器对象。
像这样:
it("should ... when running in an obscure environment", inject(function ($window) {
$window.navigator = {
userAgent: 'Mozilla/5.0 (NodeJS; Karma 0.0.0) (Cucumber/0.0 like virtualisation) Fantasy/0.0',
appVersion: '5.0 (NodeJS; Karma 0.0.0) (Cucumber/0.0 like virtualisation) Fantasy/0.0',
platform: 'nodeKarma'
};
scope.$digest();
.......
}));
一定要包含足够的属性!
问题可能是您没有在 karma.conf.js
中使用协议 "https:"
我遇到了完全相同的问题,直到我添加了以下行(当然还有正确的证书)。
config.set({
protocol: 'https:',
httpsServerOptions: {
key: fs.readFileSync('server.key', 'utf8'),
cert: fs.readFileSync('server.crt', 'utf8')
},
我得到了一个 AngularJS WebApp,我用 Karma 和 Jasmine.js
测试了它但是如果我在我的控制器中使用 navigator.webkitGetUserMedia() 它会抛出一个错误。
TypeError: 'undefined' is not a function (evaluating 'navigator.webkitGetUserMedia')
这是我的控制器示例
app.controller('appCtrl', function ($scope, $interval, $location, globVal, loginService) {
navigator.webkitGetUserMedia({video: true, audio: false},
function (stream) {
globVal.webcam = window.URL.createObjectURL(stream);
},
function (err) {
console.log("error happened:" + err);
}
);
$scope.startTimeout = $interval(function () {
// do something
}, 2000);
});
我的测试规格
'use strict';
describe("控制器:appCtrl", function () { 变量 $rootScope, $范围, 控制器, 全局值, 位置;
beforeEach(function () {
module('myModul');
globVal = {
customer: {why: 'idle'},
goHome: 1,
goHomeCounter:1
};
module(function ($provide) {
$provide.value('globVal', globVal);
});
inject(function ($injector, $location) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $injector.get('$controller')("appCtrl", {$scope: $scope});
location = $location;
});
});
describe("init", function () {
it('Should init', function () {
expect($scope).toBeDefined();
});
});
describe("globVal idle", function () {
it('should globVal be idle', function () {
expect(globVal.customer.why).toBe('idle');
});
});
describe("startTimeout", function () {
it('Should have method startTimeout ', function () {
expect($scope.startTimeout).toBeDefined();
});
});
我应该如何模拟导航器对象?
使用 spyOn(navigator, 'webkitGetUserMedia');
如果这不起作用,只需创建您自己的 webkitGetUserMedia 函数作为测试规范中导航器对象的一部分。
您可以在 beforeEach 或 it("should ...") 函数中注入 $window 并替换 $window 中的整个导航器对象。
像这样:
it("should ... when running in an obscure environment", inject(function ($window) {
$window.navigator = {
userAgent: 'Mozilla/5.0 (NodeJS; Karma 0.0.0) (Cucumber/0.0 like virtualisation) Fantasy/0.0',
appVersion: '5.0 (NodeJS; Karma 0.0.0) (Cucumber/0.0 like virtualisation) Fantasy/0.0',
platform: 'nodeKarma'
};
scope.$digest();
.......
}));
一定要包含足够的属性!
问题可能是您没有在 karma.conf.js
中使用协议 "https:"我遇到了完全相同的问题,直到我添加了以下行(当然还有正确的证书)。
config.set({
protocol: 'https:',
httpsServerOptions: {
key: fs.readFileSync('server.key', 'utf8'),
cert: fs.readFileSync('server.crt', 'utf8')
},