2013-03-18 4 views
2

나는 다음과 같이 수행 모듈 패턴이 있습니다자바 스크립트 모듈 패턴 - 모든 메소드를 표시하는 방법?

var A = (function(x) { 
    var methodA = function() { ... } 
    var methodB = function() { ... } 
    var methodC = function() { ... } 
    ... 
    ... 
    return { 
     methA: methodA, 
     methB: methodB 
    } 
})(window) 

이 코드하자 제가 원하는 것입니다 무엇을 내가 좋아하는 A에만 메타와 methB()를 호출합니다. 이제 내가 가진 문제는 - 최소한의 노력으로 고통을 전혀 느끼지 않고 단위 테스트를하고 싶습니다.


먼저 그래도 나는 단순히 this을 반환 할 수 있지만, 내가 잘못했다. window 개체를 반환합니다 (누군가가 이유를 설명 할 수 있습니까?). A.__exec('methA', arguments); 그것은 내가 원하는 거의이다

__exec: function() { 
    var re = /(\(\))$/, 
     args = [].slice.call(arguments), 
     name = args.shift(), 
     is_method = re.test(name), 
     name = name.replace(re, ''), 
     target = eval(name); 
    return is_method ? target.apply(this, args) : target; 
} 

이 방법은 나 같은 메서드를 호출하자 : 두 번째

- 내 반환 블록 내부에이 방법을 포함하는 - 어디 선가 온라인 솔루션을 발견 ,하지만 꽤 못생긴. test은 프로덕션 코드에서 결코 사용되지 않을 것이라고 A.test.methA()을 선호합니다. 이는 개인 메서드를 나타 내기위한 것입니다.


편집 나는 말해 사람들이 대신 작은 부품의 큰 일을 테스트하기 위해 참조하십시오. 설명하겠습니다. 필자의 의견으로는 API는 필요한 내부 메소드 만이 아니라 필요한 메소드만을 보여 주어야한다. 크기가 작고 기능이 제한되어 있기 때문에 내부가 테스트하기가 훨씬 쉬워서 모든 것을 테스트하고 잘못 된 부분을 추측 할 수 있습니다.

내가 잘못했을 수도 있지만, 나는 여전히 개체 자체에서 모든 메서드에 대한 참조를 반환 할 수있는 방법을보고 싶습니다. :)

+4

당신은 단위 테스트 개인 방법을 사용하지 않거나 그들을 개인으로 만들지 않습니다. 간단합니다. – mpm

+1

@mpm 개인용 코드도 코드이므로 테스트해야합니다. –

+2

이것은 좋지 않습니다. 사적 방법은 사적이며, 공개 할 필요는 없습니다. 당신의 공개 방법을 테스트해라, 그들은 개인에 의존한다. 그래서 테스트하는 대중은 또한 이것을 포함해야한다. – dfsq

답변

0

js 엔진에 모듈과 공용 메소드를 추가하기 위해 네임 스페이스를 사용하지 마십시오. 이와 같이 :

window['MyApp']['MODULE1'] = { "METHOD1" : {}, "METHOD2" : {}}; 

이 모듈은 Sample module in JavaScript과 같이 씁니다.

그리고 다음과 같이 테스트 : Simple unit testing in JavaScript

평가의 사용은() 일반적으로 좋은 생각이 아니다. 당신의 질문에

+0

당신은 eval()의 권리 일지 모르지만 문제는 없습니다. 어떤 경우에는 도움이되는 언어 구조입니다. –

2

답변 (이 반환하지만 윈도우가 아닌 당신이 원하는 객체 반환) :이 기능은 객체의 메서드가 아닌 함수 내부 this는 전역 객체를 반환 자바 스크립트를.

function(){ 
    return this; 
} 

2) 개체에 this 포인트 :

var obj = { 
    value: "foo", 
    getThisObject: function(){ 
     return this; 
    } 
} 

귀하의 경우 예를 들어, #입니다 전역 객체()에

1) this 포인트 :

다음 예를 고려해 1, 당신은 함수를 가지고 있기 때문에, 그것은 객체를 반환합니다. 이 함수는 어떤 객체의 메소드가 아닙니다.

당신의 질문에 대한 최고의 대답은 공공의 방법을 테스트하는 것입니다,하지만 당신을 위해 매우 중요 경우, 나는 다음을 제안 할 수 있습니다

를 서버 측에서 동적 모듈을 만들 수 있습니다.

작동 원리 :

  • 당신이 원하는 기능을위한 별도의 스크립트를 만들;
  • 이러한 개별 스크립트에 대한 테스트를 만듭니다.
  • 원하는대로 스크립트를 결합하는 메서드를 만듭니다.
  • 스크립트를로드하려면 결합 스크립트 방법을 참조하십시오.

바라기를 바꿔서 문제를 해결할 수 있기를 바랍니다. 행운을 빕니다!