在我的AngularJS(1.4.4)应用程序中,我有工厂:
( function () {
"use strict";
angular
.module("app")
.factory("DeviceTypeService", DeviceTypeService);
function DeviceTypeService($window) {
function isTablet () {
var width = $window.innerWidth;
return width > 639;
}
return {
isTablet: isTablet
};
}
})();
我需要用Jasmin对它进行单元测试,在Karma上运行。我尝试了不同的解决方案,但我的测试每次都失败了。
我的解决方案之一:
'use strict';
describe('DeviceType Service', function(){
var mock_window,
sut;
beforeEach(function(){
module('app');
mock_window = {innerWidth: 1000};
module(function($provide){
$provide.value('$window', mock_window);
});
});
beforeEach(inject(function(_DeviceTypeService_){
sut = _DeviceTypeService_;
}));
it('isTablet() method shoul return "true" if $window.innerWidth > 639 px', function(){
expect(sut.isTablet()).toBeTruthy();
});
});
此测试返回FAILED Expected false to be truthy
。我几乎试图为$window.innerWidth
创建SPY,但它也不起作用。
我用: PhantomeJS(v 1.9.18)。 茉莉花(第2.3.4节)。 卡玛(第0.13.10节)
请告诉我我的错误或提供一些工作代码。
答案 0 :(得分:1)
我没有设法找出错误的原因,因为当我尝试你的例子时,它完全没问题并且测试通过了。
我已将您的样品放在jsfiddle上 - 您可以自行检查:"运行" &安培;在输出中都是绿色的。
我添加的唯一内容是:
link to http://jasmine.github.io/2.3/lib/jasmine.js
link to http://jasmine.github.io/2.3/lib/jasmine-html.js
link to http://jasmine.github.io/2.3/lib/jasmine.css
link to http://jasmine.github.io/2.3/lib/boot.js
link to http://code.angularjs.org/1.4.4/angular.js
link to http://code.angularjs.org/1.4.4/angular-mocks.js
var myApp = angular.module('app', []); - before your code
uninteresting copy of IsTablet - just to play with and see something red
copied-pasted a simple Jasmine runner at the end of the file
所以......可以肯定地说,没有实际的改变。
在小提琴上自己尝试一下,如果代码没有重大变化,请检查libs版本是否相同,检查你是否忘记了像角度模拟这样的东西
仅供参考:首先,我没有注意到您使用的版本,我在角度1.2.9和jasmine 1.3上测试了您的代码 - 它有效。当我更新小提琴使用角1.4.4和茉莉花1.3 - 它仍然有效。现在我将它更新到几乎你的版本 - 1.4.4 / 2.3.0 - 仍然有效。我没有找到任何2.3.4镜子。
..所以,也许它与Phantom有关?但这很奇怪,因为它不应该对有角度的$窗口做任何特殊处理。