2015-01-11 5 views
0

아래는 casperjs와 mockjax를 사용하는 코드입니다. 그러나, mockjax는 ajax 호출을 인터셉트 할 수 없습니다. 모의 응답 대신 ajax 응답을 반환합니다. 또한, $ .mockjax.mockedAjaxCalls(). length 이것은 아무것도 인쇄하지 않습니다. 내가 여기서 뭘하고 있는지 알 겠어?MockJAX가 CasperJS에 응답하지 않습니다

실제로 외부 평가 컨텍스트가 아닌 $ .mockjax.mockedAjaxCalls() 값을 인쇄 할 수있는 방법이 있습니까? mock4.png에 mockjax 콜백이 발생하지 않았 음을 나타내는 스크린 샷이 표시됩니다.

var casper = require("casper").create({ 
    verbose: true, 
    logLevel: 'error', 
    clientScripts: ["jquery.mockjax.js", "jquery.js", "json2.js"] 
}); 

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

casper.start('http://xyz:9000/abc', function() { 
    this.evaluate(function() { 
     this.capture('1.png') 
     $.mockjax({ 
      url: '/foo1', 
      responseTime: 100, 
      dataType: 'json', 
      responseText: { 
       sessionTimeoutRedirectUrl: "https://foo/hello", 
       errorCode: "error.session.timeout" 
      } 
     }); 
    }); 
    this.capture('xyz123.png'); 
}); 


casper.waitForSelector('#order-wrapper', function() { 
    this.click('#method-field-cc'); 
    this.capture('mock2.png'); 
}); 
casper.waitForSelector('#cc-card-number', function() { 

    this.capture('mock.png'); 
    this.fillSelectors('form[id="cc-form"]', { 
     'input[id="cc-card-number"]': '4112344112344113', 
     'input[id="cc-first-name"]': 'first', 
     'input[id="cc-last-name"]': 'last', 
     'select[id="cc-expiry-month"]': '10', 
     'select[id="cc-expiry-year"]': '2016', 
     'input[id="tax-field-postal-code"]': '95051', 
     'input[id="cc-security-code"]': '123' 
    }, true); 
    this.click('#review-newcc'); 
    this.capture('mock3.png'); 

}); 

casper.wait(1000, function() { 
    this.echo("I've waited for a second."); 
    casper.evaluate(function() { 
     this.echo("I've waited for a second." + $.mockjax.mockedAjaxCalls().length) 
     console.log($.mockjax.mockedAjaxCalls()); 
    }); 


}); 
casper.evaluate(function() { 
    this.echo("I've waited for a second." + $.mockjax.mockedAjaxCalls().length) 
}); 
casper.wait(1000, function() { 
    this.capture('mock4.png') 

}); 

casper.run(); 
+0

URL : '/ foo1'을 (를) 치려고하는 위치가 표시되지 않습니다. Mockjax는 URL (및 기타 아약스 설정)과 일치하는 요청만을 보낸다. – jakerella

답변

0

콜백은 페이지 컨텍스트입니다. casper 인스턴스 또는 외부의 다른 변수를 사용할 수 없습니다. 따라서 thiscasper 인스턴스가 아니라 페이지의 window 인스턴스를 참조합니다. capture 또는 echo 기능이있을 가능성은 낮습니다. 이 호출을 evaluate 콜백에서 캐스퍼 컨텍스트로 이동합니다. 이를 수행하기 전에 page.error 이벤트에 등록하고 오류가 발생하는지 확인하십시오.

다른 문제는 jQuery를 추가하기 전에 mockjax를 추가한다는 것입니다. mockjax는 jQuery 플러그인이므로 clientScripts에서 주문을 반전해야합니다. jquery.js을 완전히 삭제하는 것이 더 좋을 수 있습니다. 페이지의 내용을 덮어 쓰게되기 때문입니다.

+0

$ .mockjax.mockedAjaxCalls()는 casper.evaluate 컨텍스트 외부에서 사용할 수 없습니다. 평가 컨텍스트 외부에이 스크립트를 실행하면 오류가 발생합니다. $ .mockjax.mockedAjaxCalls()의 값을 실제로 인쇄 할 수있는 방법이 있습니까? –

+0

나는이 줄이 '평가'밖에 있어야한다고 말하지 않았다. 나는 '이'로 시작하는 다른 줄이 밖에 나가야한다고 말했다. 'remote.message' 이벤트에 등록한 이후로 값을 출력해야합니다. –

+0

내 조언을 모두 따라 왔습니까? 나는 OP가 그들을 무시한다는 것을 알기 위해서만 답을주는 것을 좋아하지 않습니다. 'page.error' 이벤트 핸들러를 추가하고 거기에 어떤 에러가 있는지보십시오. –

0

Mockjax는 jQuery의 인터페이스를 덮어 써서 ajax 호출을 캡처하고 미리 정의 된 응답으로 돌아갑니다. jockery.js 다음에 mockjax를 배치해야합니다. clientScripts : [ "jquery.js", "json2.js", "jquery.mockjax.js"]

더 안정적이고 일반적인 솔루션은 JSMockServer입니다. https://github.com/gaisanshi/JSMockServer