2016-12-13 6 views
2

cucumber.js에 한 단계 (여러 웹 사이트가있는 플랫폼의 페이지)에 현재 탐색 상태를 저장하려고하므로 다음 단계가 필요합니다. 시나리오는 그것을 처리 할 수 ​​있습니다. 나는 그것을 위해 세계 물체를 사용한다고 생각했지만 불가사의 한 일들이 일어나고 있습니다.cucumber.js의 월드 오브젝트 또는 오이 테스트에서 상태를 넣을 위치

는이 같은 탐색 상태 개체가 : 그럼

module.exports = { 
    pageName:null, 
    siteName: null, 
    isLoggedIn: false 
} 

내가이

function NavigationStateManager() { 
    var state 
    this.setState = function(stateP) { 
     state = stateP 
    } 
    this.setPage = function(pageNameP, siteNameP, isLoggedInP) { 
     // among other things do something link this: 
     state.pageName = pageNameP 
     state.siteName = siteNameP 
     state.isLoggedIn = isLoggedInP 
    } 
} 

같은 NavigationStateManager이를 그리고 세계 객체 내 단계에서

var navState = require('./navigation-state') 
var NavigationStateManager = require('./navigation-state-manager') 

var navigationStateManager = new NavigationStateManager() 

function World() { 
    this.navState = simpleCopy(navState) 
    navigationStateManager.setState(this.navState) 
} 

function simpleCopy(objectToCopy) { 
    var copy = {} 
    for(var key in objectToCopy) { 
     copy[key] = objectToCopy[key] 
    } 
    return copy 
} 

이 파일 나는 이것을한다

var World = require('../support/world') 

module.exports = function() { 
    this.World = World 

    this.Given(...) 
    this.Then(...) 
} 

주어진 단계가 실행되고 Then 단계가 실행될 때 어떤 이유로 NavigationStateManager에서 상태가 정의되지 않게됩니다. 로그 할 때 setState가 '정의되지 않은'인수로 호출되는 것을 볼 수 없습니다. World 객체에 NavigationStateManager를 두는 다른 설정이 있지만 비슷한 문제가 발생했습니다. 분명히 월드 오브제먼트는 시나리오의 모든 단계를 통해 동일하게 유지되지 않지만 어떻게 동작합니까? 오류가 내가 가진 모든 JavaScript 지식에 어긋나는 것 같습니다. 어디에서 시험을 치러야합니까?

+0

이 문제가 발생한 단계의 예를 보여줄 수 있습니까? – RedMage

+0

조금 업데이트했습니다. 나는 정확한 코드를 가지고 있지 않다. 내가 지금 이해하고있는 것들 중 하나는 지원 폴더에있는 모든 것이 오이에 의해 자동으로로드된다는 것입니다. 수동으로로드 했으므로 아마 두 개의 World 객체를 만들었을 것입니다. 그러나 나는 왜 그것이 주어진 단계에서 내 자신의 World 객체를 사용하는지, 그리고 나서 오이는 Then 단계에서 World 객체를 생성했는지 모르겠다. 나는 아직도 당신이 알고있는 경우에 World 객체에 대한 라이프 사이클 및 사용 사례에 대한 세부 사항을 너무 이해하고 싶습니다. 감사. – raichu

+0

당신은 머리에 못을 박았습니다. World 변수를 할당 한 업데이트 된 코드를 보자 마자 나는 "모든 종류의 문제를 일으킬 것입니다"라고 생각했습니다.구체적인 내용은 모르지만 잠재적으로 도움이 될만한 것이 있습니다. "chimpjs"라는 모듈이 있습니다. 당신이 웹 인터페이스 테스트를 위해 오이를 사용한다면 강력하게 추천 할 수는 없습니다. 그것은 오이, webdriverio, 차이 티, 그리고 다른 좋은 것들을 함께 묶습니다. 그것은 당신을 위해 셀레늄을 관리하고 섬유를 사용하므로 동기식 스타일로 테스트를 작성할 수 있습니다. – RedMage

답변

1

함수가 다음과 같은 방법을 노출하는 컨텍스트 호출됩니다 내보내는 모든 지원 파일 :

소스 : https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/api_reference.md

아마하지 않을이 (읽기 및하지 않았을 이해했다). 나는 또한 문맥 객체에 대한 참조와 세계 객체에 대한 참조 인 this을 혼동했다.

컨텍스트와 함께 내보낼 함수에 this으로 표시되는 개체를 의미합니다. Cucumber API와 상호 작용하는 인터페이스입니다.

이른바 컨텍스트 개체는 월드 개체와 혼동되어서는 안됩니다. 월드 개체는 단계 내에서 this 참조이며 모든 시나리오에 대해 컨텍스트 개체에 설정 한 World 생성자에서 오이 (또는 설정하지 않은 경우 기본값)에 의해 만들어집니다.

마지막으로 지원 폴더에 내 보낸 모든 생성자의 새 인스턴스를 필요로하지 않아야합니다. Cucumber가 자동으로 이러한 생성자를 호출하기 때문에 동일한 객체의 두 인스턴스가 생성됩니다. PageObject와 같은 자신 만의 도우미 객체를 별도의 폴더에 넣습니다.

+0

굉장합니다. 당신이 이것에서 위로 올라간 것처럼 보입니다! – RedMage