茉莉花测试javascript getter无法正常工作

Ric*_*rmo 9 javascript jasmine angularjs

我正在为一个angularjs工厂写一些测试,一些期望不起作用,我真的不知道为什么.

这是我的工厂(部分).'使用严格';

angular.module('myAppMod')
  .factory('Person', function(BaseModel) {
    return BaseModel.extend({
      get fullname() {
        var name = [];
        if (this.first_name) {
          name.push(this.first_name);
        }
        if (this.person_extra && this.person_extra.middle_name) {
          name.push(this.person_extra.middle_name);
        }
        if (this.last_name) {
          name.push(this.last_name);
        }
        return name.join(' ');
      }
    });
  });
Run Code Online (Sandbox Code Playgroud)

和茉莉花测试:

var p;
beforeEach(function() {
  p = new Person({
    first_name: 'first_name',
    person_extra: {
      middle_name: 'middle_name',
      media_item_id: null
    },
    last_name: 'last_name',
    security_level: 'security_level'
  }, true);
});

it("has a fullname", function() {
  expect(p.fullname).toEqual('first_name middle_name last_name');
});
Run Code Online (Sandbox Code Playgroud)

p.fullname正在返回""(空字符串)并在工厂中console.log(this.first_name),是undefined.

任何帮助都非常感谢.先感谢您

cha*_*pwd 6

编辑:经过进一步调查,我改变了我的答案.

它无法正常工作,因为您通过该方法使用getter简写(get fnName() { })extend.该吸的 this是匿名的对象本身并不会继承骨干模型的方法和属性,而this在功能特性做.我已经制作了一个说明问题的代码.

也就是说,如果这是你的模特

 var Model = BaseModel.extend({
   get isBackboneModelThroughGetter() {
     return !!this.get;
   },
   isBackboneModel: function() {
     return !!this.get;
   },
 });
Run Code Online (Sandbox Code Playgroud)

那么Model的一个实例将使这个测试通过:

it('should make you wonder', function() {
   var model = new Model();
   expect(model.isBackboneModel()).toBe(true);
   expect(model.isBackboneModelThroughGetter).not.toBe(true);
});
Run Code Online (Sandbox Code Playgroud)

因此,要使您的工厂工作,您将需要:

  1. 通过适当的Backbone调用替换每个属性访问:this.get('propertyName')而不是this.propertyName
  2. 按功能属性替换所有getter:full_name : function() { /*...*/ }而不是get full_name() { /* ... */ }
  3. 更换呼叫model.full_name通过model.full_name();