2012-05-02 13 views
8

He creado una actividad codificada y ahora quiero probarla en una unidad, pero no sé cómo. Se apreciará cualquier ejemplo.Pruebas unitarias de la actividad del código WF

Mi ejemplo simple está a continuación.

public sealed class ParameterActivity : CodeActivity 
{ 
    public InArgument<int> Argument1 { get; set; } 
    public InArgument<int> Argument2 { get; set; } 
    public OutArgument<int> Result { get; set; } 

    protected override void Execute(CodeActivityContext context) 
    { 
     var a = context.GetValue(Argument1); 
     var b = context.GetValue(Argument2); 

     context.SetValue(Result, a + b); 
    } 
} 
+0

he encontrado este enlace que fue muy útil: http://daysincode.blogspot.co.uk/2012/05/unit-test-of-workflow-for-code-action.html – cpoDesign

+0

Eso es básicamente lo mismo que pensar que te mostré en mi respuesta. Simplemente use 'CodeActivity ' para actividades con un valor de retorno único. Debe hacerse. A continuación, puede usar fácilmente 'WorkflowInvoker.Invoke ()' para obtener el valor – Joao

+0

También son más fáciles de probar la unidad, como puede ver por la diferencia entre mi código y el código de la publicación del blog. – Joao

Respuesta

17

En primer lugar, en caso de que su actividad devuelve un solo valor, simplemente heredan de CodeActivity<TResult> y fácilmente anulan Ejecutar() con TResult como tipo de retorno. Además, ya tiene disponible un OutArgument<TResult> Result.

public sealed class ParameterActivity : CodeActivity<int> 
{ 
    public InArgument<int> Argument1 { get; set; } 
    public InArgument<int> Argument2 { get; set; } 

    protected override int Execute(CodeActivityContext context) 
    { 
     var a = Argument1.Get(context); 
     var b = Argument2.Get(context); 

     return a + b; 
    } 
} 

Dicho esto, WorkflowInvoker es el camino a seguir a la unidad de prueba de casi todas sus actividades. Teniendo por encima de la actividad de código personalizado como ejemplo:

[TestFixture] 
public TParameterActivity 
{ 
    [Test] 
    public void ParameterActivity_Test001() 
    { 
     var activity = new ParameterActivity(); 

     var input1 = new Dictionary<string, object> 
     { 
      { "Argument1", 10 }, 
      { "Argument2", 5 } 
     }; 

     var input2 = new Dictionary<string, object> 
     { 
      { "Argument1", -13 }, 
      { "Argument2", 3 } 
     }; 

     var output1 = WorkflowInvoker.Invoke<int>(activity, input1); 
     var output2 = WorkflowInvoker.Invoke<int>(activity, input2); 

     Assert.That(output1, Is.EqualTo(15)); 
     Assert.That(output2, Is.EqualTo(-10)); 
    } 
} 

En lugar de WorkflowInvoker también se puede utilizar WorkflowApplication pero para las pruebas unitarias que no parece en absoluto necesario cuando lo que desea invocar rápidamente los flujos de trabajo de corta duración para que ellos hagan "lo suyo" y regresen. A menos que desee probar cosas más elaboradas, como flujos de trabajo asincrónicos y/o marcadores.

También querrá comprobar Microsoft.Activities.UnitTesting.

+1

Asegúrese de consultar ¿Cómo utilizo Microsoft.Activities.UnitTesting? también http://wf.codeplex.com/wikipage?title=How%20do%20I%20use%20Microsoft.Activities.UnitTesting&referringTitle=Microsoft.Activities.UnitTesting%20Overview –