我正在进行一些关于AngularJS的TDD(另一个故事),遇到了一个问题,我的beforeEach调用显然没有被执行。我将其简化为以下示例。
这个示例可以工作,因为在beforeEach和it中的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,karma 0.12.31,jasmine 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
});
});
此外,“module('userApp'...”中的代码似乎从未执行过...?
module()
注入_$log_
,但这样是行不通的。module()
仅用于注册模块,当你调用inject()
时将执行这些模块。注入是由注射器完成的工作。如果你在这里立即调用inject()
,它可能被视为“同时”。在我的示例中,我已经将inject
移动到同一个beforeEach
中,以使其更清晰明了。 - Michael Radionovmodule
像在真实应用中一样注册你的模块/服务/工厂/控制器;而inject
则启动了该应用。如果你首先调用“inject”(意味着你的应用已经启动),那么你将无法在此后注册新的模块并再次调用“inject”(重新启动应用)。同样适用于测试工作流程。这个例子非常宽泛,但可以帮助理解。 - Michael Radionov