2017-08-17 4 views
-1

のユニットテストを追加するにはどうすればよい私は、この機能のためのユニットテストを追加しようとしています:は、我々はJavascript hasOwnPropertyを()関数

var advance = function (des, source) { 
     for (var p in source) { 
      if (source.hasOwnProperty(p)) { 
       des[p] = source[p]; 
      } 
     } 
     return des; 
}; 

はどのように我々はジャスミンでhasOwnProperty()方法をチェックしますか?

編集: 解決策

var des; 
var source; 
beforeEach(function() { 
    des = {}; 
    source = { 
     p: 'value', 
     p1: 'value1' 
    }; 
}); 

beforeAll(function() { 
    advance(des, source); 
}); 

it('should has a property with the name of the argument', function() { 
    expect(source).toEqual(jasmine.objectContaining({ 
     p: 'value' 
    })); 
    expect(source).not.toEqual(jasmine.objectContaining({ 
     p2: 'value2' 
    })); 
}); 

誰かは、任意のより良い解決策を提案してください。

+0

もっと良い解決策は何ですか?あなたの現在のユニットテストは何ですか? –

+0

そして、十字タグ付けをしないでください。 Java!= JavaScript! – GhostCat

+0

何が解決策ですか?あなたは自分の試みを提供しませんでした。 –

答えて

2

hasOwnProperty()は、指定されたプロパティ名がオブジェクト自体の一部であり、プロトタイプチェーンではない場合にtrueを返します。これはテストを失敗する

describe("hasOwnProperty", function() { 
    var dest, src; 

    beforeEach(function() { 
     dest = { }; 

     function Foo() { 
      this.a = 1; 
      this.b = 2; 
     } 
     Foo.prototype.c = 3; 
     src = new Foo(); 

     advance(dest, src); 
    }); 

    it("should not pick non-own properties", function() { 
     expect(dest.c).not.toBeDefined(); 
    }); 

    it("should pick own property", function() { 
     expect(dest.a).toBe(1); 
     expect(dest.b).toBe(2); 
    }); 
}); 

function Foo() { 
    // own properties of "src" 
    this.a = 1; 
    this.b = 2; 
} 
// not own property of "src" 
Foo.prototype.c = 1; 
src = new Foo(); 

あなたのテストは、次のようになります。

したがって、あなたは、このようなプロトタイプにプロパティを作成することによって、このようなオブジェクトを「シミュレート」することができます:

function Foo() { 
    this.a = 1; 
    this.b = 2; 
    // Own property - spec demands this to be undefined 
    this.c = 3; 
} 
// Defined (above) as own property instead 
// Foo.prototype.c = 3; 
src = new Foo(); 
+0

素敵な説明をありがとう:) – supun94