AngularJS + Jasmine:如何从套件测试中的每个规范的新模块开始

时间:2014-10-25 12:30:51

标签: angularjs unit-testing jasmine

这是我的简单代码

var app = angular.module('myApp', [])
  .value('SimpleValue', {
    aaa: '£££'
  });

和单元测试

describe('ttt', function() {

  beforeEach(module('myApp'));

  it('ttt', inject(function(SimpleValue) {
    expect(SimpleValue.aaa).toEqual('£££');
    SimpleValue.aaa = 4;
  }));

  it('ttt', inject(function(SimpleValue) { // This doesn't start fresh and fails
    expect(SimpleValue.aaa).toEqual('£££');
  }));

});

describe('ttt', function() { // Neither does this

  var SimpleValue;
  beforeEach(module('myApp'));

  beforeEach(inject(function(_SimpleValue_) {
    SimpleValue = _SimpleValue_;
  }));

  it('ttt', function() {
    expect(SimpleValue.aaa).toEqual('£££');
  });

});

这不是我期望beforeEach(module('myApp'));的行为。根据文档,在每个规范之前使用module('myApp')有什么意义:https://docs.angularjs.org/api/ngMock/function/angular.mock.module它只是

  

收集通过注入创建注入器时将使用的配置信息。

?我认为它会重置myApp以便为每个it块启动清理,但事实证明它并没有。

有人可以对此有所了解吗?请看一下:

http://plnkr.co/edit/xMmstHxL2prQukXpXYXm?p=preview

2 个答案:

答案 0 :(得分:0)

注册.value的服务无法重置。我不能告诉你原因,但看起来确实出乎意料。

例如,使用.factory注册,测试按预期传递。

var app = angular.module('myApp', [])
// .value('SimpleValue', {aaa: '£££'});
    .factory('SimpleValue', function () {
        return {aaa: '£££'}; 
    });

答案 1 :(得分:0)

这里的事情是,在第一次测试中,您正在修改对象的属性。但重要的是要意识到整个系统中只有该对象的一个​​副本。稍微改写myApp应该更清楚:

var simpleValue = {aaa: '£££'};
var app = angular.module('myApp', []).value('SimpleValue', simpleValue);

请参阅,您有点假设脚本的这一部分是作为每个规范的一部分执行的,但事实并非如此(代码的这个片段只加载到浏览器中一次)。

希望这个掠夺者能够清楚地了解整个故事:http://plnkr.co/edit/iLuIPaLyVFgzoTLygFz1?p=preview