2017-03-07 10 views
3

Specflow에서는 dependency injectionSpecflow의 종속성 삽입은 기능 당 하나의 컨텍스트 개체입니까?

을 사용하여 단계 정의간에 컨텍스트를 공유 할 수 있습니다. 그러면 각 기능에 대해 서로 다른 "컨텍스트"클래스가 생성됩니까?

그렇다면이 기능을 통해 단계 정의를 공유하는 것이 비실용적이지 않습니까? 필드가 설정되었다고 가정하십니까?

+0

"필드가 설정되었다고 가정합니까?"란 무엇을 의미합니까? 단계 파일의 비공개 필드를 언급하고 있습니까? –

답변

1

각 기능마다 다른 "컨텍스트"클래스가 있다는 뜻입니까?

나는 그런 경우가 아니라고 생각합니다. 사양을 작성할 때 시스템의 여러 종류의 "종류"를 분명히 언급 할 것입니다.

  • 등록
  • 인증
  • 가 ToDoItem 생성
  • 가 ToDoItem 목록 : 우리는 시스템의 여러 부분과 상호 작용하고이 경우

    Scenario: List todo items 
        Given I'm registered as [email protected] 
        And I'm logged in as [email protected] 
        And I add a todo item with the text 'Listen to stackoverflow podcast' 
        When I list all my todo items 
        Then I should see the following items 
        | Text       | Completed | 
        | Listen to stackoverflow podcast | false  | 
    

    : 이제 우리는 다음과 같은 시나리오를 가정 해 봅시다

wh 이 기능의 단계를 구현하는 도중에 우리는 아마 다음과 같이 구성 단계 파일을하게 될 겁니다 :

  • AuthSteps
    • Given I'm registered as __
    • Given I'm logged in as __
  • TodoItemsSteps
    • I add a todo item with the text '__'
    • When I list all my todo items
    • 이 경우

  • Then I should see the following items
상황에 맞는 주사를 사용하여 우리가 "와 같은 말을 할 수 CurrentUser의 가치를 공유 할 것이다 나는 모든 항목 할 일 목록을 때 ", 현재 사용자를 참조하십시오. 이 방법으로 다른 stepFile의 다른 모든 단계는 이전 단계의 문맥이 될 수 있습니다.

한편, 이러한 기능 관련 문제를 공유하는 유일한 단계는 동일한 기능 파일에 있기 때문에 When I list all my todo items의 결과와 함께 컨텍스트 삽입을 사용하지 않습니다. Then I should see n items과 같이 then '진술'의 여러 변형을 사용할 수 있습니다.

컨텍스트 주입을 사용하여 구성중인 서비스의 종속성을 공유하는 데 사용하는 클래스가 두 개 이상 있거나 서비스 자체 (저장소, 세션 등 ...)가 있다고 생각합니다.)

1

개체의 수명은 시나리오마다 있습니다. 즉, 모든 시나리오/테스트마다 별도의 인스턴스를 얻을 수 있습니다.

이렇게하면 서로 다른 테스트간에 상태를 공유 할 수 없으므로 서로 영향을 줄 수 없습니다.

1

IMHO 테스트의 기능을 기반으로하지 않고 시스템의 '도메인'을 기반으로 컨텍스트를 사용해야합니다.

우리는 이와 같은 컨텍스트가 좋은 캡슐화를 제공하고 더 논리적임을 발견했습니다. 따라서 UserContext, CartContext, PaymentContext 등이있을 수 있습니다. 그런 다음이 컨텍스트에서 함수 나 데이터가 필요한 단계는 생성자에서 요청합니다.

Andreas가 말했듯이 specflow는 시나리오별로 격리되도록 컨텍스트를 관리합니다.

0

기능에 종속되지 않습니다. 모든 시나리오는 자체 컨텍스트를 가지며 시나리오가 끝나면 끝날 것이며 다른 기능은 동일한 컨텍스트를 사용할 수 있습니다