2013-10-17 2 views
0

Ruby 배경에서 왔으며 JSON API 끝점을 검색 한 객체와 상호 작용하는 자바 스크립트 라이브러리를 테스트하려고합니다.객체 속성의 임의적 조롱

다음 Ruby를 자바 스크립트로 어떻게 다시 만들 수 있습니까?

class ArbitraryMock 
    def initialize(property_hash) 
    @property_hash = property_hash 
    end 

    def method_missing(*args) 
    @property_hash[args.first] || '' 
    end 
end 

EDIT : method_missing은 메소드가 존재하지 않을 때마다 호출되는 동적 메소드입니다. 이 메서드의 기본 버전은 NoMethodError를 발생시킵니다 (Javascript는 내가 정의하지 않은 값을 반환 함). 위에서와 같은 방법으로 메서드를 재정의함으로써, 다음과 같은 일을 수행 할 수 있습니다

some_object = ArbitraryMock.new(foo: 'bar') 

some_object.foo 
=> 'bar' 
some_object.bang 
=> '' 
+0

method_missing의 기능은 무엇입니까? 이 컨텍스트에서는 속성 값 또는 빈 문자열을 반환하는 데 사용됩니까? getters/setters로 뭔가를 할 수 있습니다. – Andy

+0

제 질문의 수정 된 버전을 확인하십시오. – HaaR

+0

답변을 업데이트했습니다. 나는 그것이 약간의 사용이되기를 바랍니다. – Andy

답변

0

Javascript doesn't have an equivalent to method missing 때문에, 내가 뭘 생각할 수있는 유일한 방법은이 getter 및 setter로했다.

매개 변수를 초기화하십시오. 각 속성에는 getter 및 setter가 있습니다. getter는 private 변수 또는 빈 문자열의 값을 반환합니다. setter는 private 변수를 할당 된 값으로 설정합니다.

var params = { 
    get name() { return this._name ? this._name : ''; }, 
    set name(name) { this._name = name; }, 
    get dog() { return this._dog ? this._dog : ''; }, 
    set dog(dog) { this._dog = dog; } 
}; 

arbitraryMock 개체를 설정하고 초기화하십시오. 초기화 메소드는 getter와 setter를 객체에 고정합니다.

var arbitraryMock = { 
    initialise: function (params) { 
     for (var k in params) { 
      this[k] = params[k]; 
     } 
    } 
}; 

arbitraryMock.initialise(params); 

이름 값 테스트는 처음에는 빈 문자열을 반환합니다.

console.log(arbitraryMock.name); // empty string 

그러나 당신이 당신이 개체에 추가 한 다른 속성 작동 name

arbitraryMock.name = 'Basil Fawlty'; 
console.log(arbitraryMock.name); // 'Basil Fawlty' 

에 값을 할당합니다.

console.log(arbitraryMock.dog); // empty string 
arbitraryMock.dog = 'Terrier'; 
console.log(arbitraryMock.dog); // 'Terrier' 

Fiddle.

희망이 조금 도움이됩니다.

+0

미안하지만, 내가 루비 코드를 설명 했어야 - method_missing 정의되지 않은 개체에 대한 메서드를 호출하려고하면 호출되는 동적 메서드입니다. – HaaR

관련 문제