2012-05-02 13 views
8

Ho creato un'attività codificata e ora voglio testarlo unitamente, ma non so come. Qualsiasi esempio sarà apprezzato.Test unitario dell'attività del codice WF

Il mio semplice esempio è qui sotto.

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

ho trovato questo collegamento che è stato utile: http://daysincode.blogspot.co.uk/2012/05/unit-test-of-workflow-for-code-action.html – cpoDesign

+0

Questo è praticamente lo stesso che ti ho mostrato nella mia risposta. Basta usare 'CodeActivity ' per attività con un valore di ritorno univoco. La maggior parte lo fa. Quindi puoi facilmente usare 'WorkflowInvoker.Invoke ()' per ottenere il valore – Joao

+0

Sono anche più facili da testare l'unità, come puoi vedere dalla differenza tra il mio codice e il codice del post del blog. – Joao

risposta

17

Prima di tutto, nel caso in cui la vostra attività restituisce un singolo valore, solo ereditano da CodeActivity<TResult> e facilmente sovrascrivere execute() con TResult come tipo di ritorno. Inoltre, hai già uno 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; 
    } 
} 

Detto questo, WorkflowInvoker è la strada da percorrere per unità di prova quasi tutte le vostre attività. Prendendo sopra attività di codice personalizzato come ad esempio:

[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)); 
    } 
} 

Piuttosto che WorkflowInvoker è anche possibile utilizzare WorkflowApplication ma per unit testing che non sembra affatto necessario quando si vuole solo richiamare rapidamente i flussi di lavoro di breve durata per loro di fare "la loro cosa" e tornare. A meno che non vogliate testare cose più elaborate come i flussi di lavoro asincroni e/oi segnalibri.

Si potrà anche controllare Microsoft.Activities.UnitTesting.

+1

Assicurarsi di guardare Come utilizzare Microsoft.Activities.UnitTesting? nonché http://wf.codeplex.com/wikipage?title=How%20do%20I%20use%20Microsoft.Activities.UnitTesting&referringTitle=Microsoft.Activities.UnitTesting%20Panoramica –