我有一个angularjs应用程序,其中包含一些使用jquery和bootstrap组件的指令.因此,为了测试指令,我在karma.unit.conf.js中定义了以下文件顺序:
files = [
JASMINE,
JASMINE_ADAPTER,
'app/components/jquery/jquery.js',
'app/scripts/vendor/bootstrap.js',
'app/components/angular/angular.js',
'app/components/angular-mocks/angular-mocks.js',
'app/components/angular-ui/build/angular-ui.js',
'app/scripts/app.js',
'app/scripts/**/*.js',
'test/spec/unit/**/*.js'
];
Run Code Online (Sandbox Code Playgroud)
如果我加载第一个angularjs和angular-mocks然后加载jquery和bootstrap,测试运行并失败,因为angular使用自己的jQLite.但如果我按照我在这里写的那样改变顺序,那么这就是我得到的:
我发现它不是jQuery造成异常的原因......它是bootstrap.js.如果我对bootstrap.js行发表评论,那么测试就会运行(并且会失败,因为预期组件永远不会被加载).如果我像上面那样加载bootstrap(或者在测试之前的任何其他地方),那么我得到这个:
PhantomJS 1.8 (Linux) Directive: tkModal should make hidden element visible FAILED[39m
at /home/ir/work/campari/app/components/jquery/jquery.js:1763
at /home/ir/work/campari/app/components/jquery/jquery.js:2833
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
...
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
at /home/ir/work/campari/app/components/jquery/jquery.js:3656
at /home/ir/work/campari/app/components/jquery/jquery.js:648
at /home/ir/work/campari/app/components/jquery/jquery.js:270
at /home/ir/work/campari/app/components/jquery/jquery.js:3657
at /home/ir/work/campari/app/components/jquery/jquery.js:3664
at /home/ir/work/campari/app/components/angular-mocks/angular-mocks.js:1589
at /home/ir/work/campari/app/components/angular-mocks/angular-mocks.js:1627
Run Code Online (Sandbox Code Playgroud)
at /home/ir/work/campari/app/components/jquery/jquery.js:2850
在测试失败之前,该行无休止地重复大约15k次(当jQuery尝试在jquery.js:1763处执行internalData函数时,似乎正在发生这种情况).
任何想法将不胜感激
找到答案,这是版本2.3.0中的引导问题,更新到2.3.1解决了它.请参阅https://github.com/twitter/bootstrap/issues/6835
twitter-bootstrap angularjs angularjs-directive karma-runner
我创建的指令使用函数setFormatting来屏蔽输入字段中的文本值.
scope.$watch(element, function() {
modelCtrl.$setViewValue(setFormatting(element.val(), attrs.symbol));
modelCtrl.$render();
});
element.bind('blur', function() {
modelCtrl.$setViewValue(setFormatting(element.val(), attrs.symbol));
modelCtrl.$render();
});
Run Code Online (Sandbox Code Playgroud)
范围.$ watch在第一次加载/应用内容时应用蒙版,element.bind为其他时间应用蒙版.范围.$ watch存储符号(如果有的话)作为ng-model变量的一部分.element.bind不是.我以为$ setViewValue()和$ render()没有更新ng-model变量.变量在哪里更新?
请参阅随附的小提琴:http
://jsfiddle.net/PJ3M4/
谢谢.
我阅读了有关 select 语句及其执行步骤的信息,但我没有完全理解这里发生的情况。
我创建了两个扇入函数的示例(来自Go 并发模式演讲)
第一个:
select {
case value := <-g1:
c <- value
case value := <-g2:
c <- value
}
Run Code Online (Sandbox Code Playgroud)
按预期从每个通道打印(每个通道都有自己的计数器):
Bob : 0
Alice: 0
Bob : 1
Alice: 1
Bob : 2
Alice: 2
Alice: 3
Alice: 4
Bob : 3
Alice: 5
Run Code Online (Sandbox Code Playgroud)
第二个:
select {
case c <- <-g1:
case c <- <-g2:
}
Run Code Online (Sandbox Code Playgroud)
它随机选择一个通道并丢弃另一个通道的值:
Bob : 0
Alice: 1
Alice: 2
Alice: 3
Bob : 4
Alice: 5
Bob …
Run Code Online (Sandbox Code Playgroud)