2012-09-25 4 views
10

Tengo varios archivos de características con algunos escenarios. Necesito ignorar varios escenarios o características, marcados con algunos @tag dependiendo de alguna condición. He leído specflow documentation pero no he encontrado algo que pueda ser útil para mi solución. Quiero usar algo como¿Cómo ignorar mediante programación algunas pruebas de aceptación utilizando TechTalk.SpecFlow y C#?

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     // This is the hot spot 
     Scenario.DoSomethingToIgnoreScenarioIfConditionButRunScenarioIfConditionFalse(); 
    }   
} 

También probé añadir dinámicamente o eliminar etiquetas

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     ScenarioContext.Current.ScenarioInfo.Tags.ToList().Add("ignore"); 
    }   
} 

pero no funcionó. ¿Tal vez hay alguna otra forma de agregar o quitar etiquetas dinámicamente? ¿O algunos métodos en la clase ScenarioContext que ignorarán el escenario actual?

Respuesta

21

tiene al menos 3 opciones:

  1. Configure Specflow para tratar la espera de pasos que ignoran con missingOrPendingStepsOutcome="Ignore" entonces se puede escribir:

    if(IgnoreTests) 
    { 
        ScenarioContext.Current.Pending(); 
    } 
    

    Es tal vez no lo que desee en función de su requisitos para los pasos pendientes.

  2. Utilice su marco de pruebas unitarias incorporado en el método para ignorar la prueba durante el tiempo de ejecución. Entonces, si está usando, por ejemplo, NUnit luego con el Assert.Ignore():

    if(IgnoreTests) 
    { 
        Assert.Ignore(); 
    } 
    

    creo que esta es la solución más limpia/más fácil.

  3. O si desea hacerlo de manera marco agnóstica pruebas y que no tienen miedo a meterse con las partes internas Specflow a continuación, puede utilizar la interfaz IUnitTestRuntimeProvider:

    if (IgnoreTests) 
    { 
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current 
         .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored"); 
    } 
    

    Esto funcionará incluso si cambia su unidad probador pero no está garantizado que esta API no se rompa en la función.

Cuestiones relacionadas