我正在为AngularJS制作一些TDD(完全是另一个故事)并遇到了我的beforeEach调用显然没有被执行的情况。我把它简化为下面的例子。
这可以通过beforeEach中的console.log消息和它们都显示出来来证明:
describe('userApp', function(){
beforeEach( function(){
console.log("in beforeEach...");
});
it('should be able to log something', function(){
console.log("in it...");
});
});
这不起作用,事实证明,beforeEach中的console.log消息未显示,并且在尝试$ log.info时它失败并抛出错误消息:TypeError: Cannot read property 'info' of undefined
describe('userApp', function(){
var $log;
beforeEach(module('userApp', function($provide) {
console.log("in beforeEach...");
// Output messages
$provide.value('$log', console);
}));
it('should be able to log something', function(){
console.log("in it...");
$log.info("Using $log for logging...");
});
});
我使用Angular 1.3.15,业力0.12.31,茉莉2.3.4。可能显而易见的是我忽略了......
编辑:Michael Radionov的解释非常有帮助;但是,我不明白为什么这个修改过的代码仍然会抛出相同的错误。
describe('userApp', function(){
console.log("starting TEST3"); <=== this prints
var $log;
beforeEach(function() {
console.log("TEST3: in beforeEach..."); <=== this prints
module('userApp', function($provide, _$log_) {
$log = _$log_;
console.log("TEST3: in beforeEach/module..."); <=== never executed
// Output messages
$provide.value('$log', console);
$log.info("TEST3: calling $log in beforeEach...");
})
});
it('should be able to log something', function(){
console.log("TEST3: in it...");
$log.info("TEST3: Using $log for logging..."); <=== $log undefined err
});
});
此外,似乎&#34;模块中的代码(&#39; userApp&#39; ...&#34;永远不会执行...?
答案 0 :(得分:5)
您的日志消息console.log("in beforeEach...");
未显示的原因是因为它实际上不在beforeEach
内,而是在作为参数传递给module(..)
的匿名函数内部成为角模拟的模块。此模块仅在注入发生时执行,同时您将收到日志消息in beforeEach...
,但测试中没有任何注入,因此它永远不会发生。 beforeEach
无论如何都会发火,你只是没有把console.log
放在正确的地方;它会起作用:
beforeEach(function () {
console.log("in beforeEach...");
module('userApp', function($provide) {
// Output messages
$provide.value('$log', console);
});
});
此外,您似乎忘记将模拟的$log
注入测试套件,您的$log
变量永远不会获得任何值,因此它会在错误状态下保持未定义。
describe('userApp', function(){
var $log;
beforeEach(function () {
console.log("in beforeEach...");
module('userApp', function($provide) {
// Output messages
$provide.value('$log', console);
});
// getting an instance of mocked service to use in a test suite
inject(function (_$log_) {
$log = _$log_;
});
});
it('should be able to log something', function(){
console.log("in it...");
$log.info("Using $log for logging...");
});
});
请参阅plunker:http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview
文档: