2012-05-02 5 views
8

Ich habe codierte Aktivität erstellt und jetzt möchte ich Einheit testen, aber ich weiß nicht wie. Jedes Beispiel wird geschätzt.Unit-Test von WF-Code-Aktivität

Mein einfaches Beispiel ist unten.

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

Ich habe diesen Link gefunden, der sehr nützlich war: http://daysincode.blogspot.co.uk/2012/05/unit-test-of-workflow-for-code-action.html – cpoDesign

+0

Das ist im Grunde das gleiche denken das habe ich dir in meiner Antwort gezeigt. Verwenden Sie 'CodeActivity ' nur für Aktivitäten mit einem eindeutigen Rückgabewert. Die meisten tun es. Dann können Sie einfach 'WorkflowInvoker.Invoke ()' verwenden, um den Wert – Joao

+0

zu bekommen. Sie sind auch einfacher zu Unit-Test, wie Sie anhand des Unterschieds zwischen meinem Code zu dem Blog-Post-Code sehen können. – Joao

Antwort

17

Vor allem im Falle Ihrer Tätigkeit einen einzelnen Wert zurückgibt, erben nur von CodeActivity<TResult> und leicht außer Kraft setzen Execute() mit TResult als Rückgabetyp. Darüber hinaus haben Sie bereits eine 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; 
    } 
} 

aber sagen, dass WorkflowInvoker ist der Weg zur Einheit Test fast alle Ihre Aktivitäten. Unter über benutzerdefinierten Code Aktivität als Beispiel:

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

Anstatt WorkflowInvoker Sie auch WorkflowApplication aber für Unit-Tests verwenden können, die gar nicht nötig scheint, wenn man nur schnell kurzlebig Workflows wollen aufrufen für sie, "ihr Ding" zu tun und zurückzukehren. Es sei denn, Sie möchten komplexere Dinge wie asynchrone Workflows und/oder Lesezeichen testen.

Sie werden auch Microsoft.Activities.UnitTesting überprüfen möchten.

+1

Achten Sie darauf, wie ich Microsoft.Activities.UnitTesting verwenden? http://wf.codeplex.com/wikipage?title=How%20do%20I%20use%20Microsoft.Activities.UnitTesting&referringTitle=Microsoft.Activities.UnitTesting%20Overview –