我正在为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, 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'...”中的代码从未执行过...?
最佳答案
未显示日志消息console.log("in beforeEach...");
的原因是,它实际上不在beforeEach
内部,而是在传递给module(..)
作为参数的匿名函数内部,该函数被angular-mocks视为模块。仅在发生注入(inject)时才会执行此模块,同时您将收到日志消息in beforeEach...
,但是测试中没有任何注入(inject),因此它永远不会发生。无论如何,beforeEach
会触发,只是您没有将console.log
放在正确的位置;它会工作:
beforeEach(function () {
console.log("in beforeEach...");
module('userApp', function($provide) {
// Output messages
$provide.value('$log', console);
});
});
同样,您似乎忘记了将模拟的
$log
注入(inject)到测试套件中,您的$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...");
});
});
见矮人:http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview
文件:
关于AngularJS/Karma测试: beforeEach not executed,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31235885/