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

AngularJS+Jasmine:如何从测试套件中每个规范的新模块开始,angularjs,unit-testing,jasmine,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('£££');

这是我的简单代码

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('£££');
  });

});
这不是我在每个模块“myApp”之前所期望的行为;。根据文档,在每个规范之前使用模块“myApp”有什么意义:它只是

收集由inject创建喷油器时将使用的配置信息

??我原以为它会重新设置myApp,使其在每个it块上都能正常启动,但事实证明并非如此

有人能解释一下吗?请看一张照片:

使用注册的服务。值不会重置。我不能告诉你为什么,但这似乎出乎意料

var app = angular.module('myApp', [])
// .value('SimpleValue', {aaa: '£££'});
    .factory('SimpleValue', function () {
        return {aaa: '£££'}; 
    });
例如,使用.factory注册,测试按预期通过

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

这里的问题是,在第一次测试中,您正在修改对象的属性。但是,重要的是要认识到,在整个系统中,这个对象只有一个副本。以稍微不同的方式重新编写myApp应该会更清楚:

var simpleValue = {aaa: '£££'};
var app = angular.module('myApp', []).value('SimpleValue', simpleValue);
请看,您假设脚本的这一部分作为每个规范的一部分执行,而不是将代码片段只加载到浏览器中一次


希望这篇文章能把整个故事讲清楚:

谢谢@user2943490。工厂的工作方式确实不同。这里有一个更新的plunk:。但我并没有告诉此值服务返回前面定义的simpleValue对象。我告诉它创建一个全新的{aaa:'英镑'}对象并返回它。仍然无法理解为什么在模块“myApp”之后不会发生这种情况。