2013-05-14 1 views
0

Microsoft.Activities.UnitTesting 목표를 사용하여 워크 플로 서비스를 테스트하려고합니다. 목표는 모든 단계가 실행되도록 서비스 확장을 모의 공격하는 것입니다.워크 플로 서비스 테스트 및 Moq

확장 기능이 호스트에 등록되어 있어도 mock 개체가 호출되지 않는 것처럼 보입니다. 예상대로 확장이 등록되지 않은 경우 예외가 발생합니다.

 WorkflowServiceTestHost host = null; 

     try 
     { 
      Mock<ISubscriber> publisher = new Mock<ISubscriber>(); 
      Mock<IWebWorker> webWorker = new Mock<IWebWorker>(); 

      var voucher = new Voucher(); 

      using (host = new WorkflowServiceTestHost(workflowServiceFile, serviceAddress)) 
      { 
       host.WorkflowExtensions.Add<ISubscriber>(() => publisher.Object); 
       host.WorkflowExtensions.Add<IWebWorker>(() => webWorker.Object); 

       host.Open(); 
       using (var factory = new ChannelFactory<IServiceInterface>(clientBinding, serviceAddress)) 
       { 
        var proxy = factory.CreateChannel() as IServiceInterface; 

        proxy.Process(voucher); 
       } 
      } 

      **//These validations fail...** 

      publisher.Verify(m => m.Push(It.IsAny<Voucher>()), Times.Once(), "ISubscriber.Push was not called."); 
      webWorker.Verify(m => m.Done(It.IsAny<Voucher>()), Times.Once(), "IWebWorker.Done was not called."); 

      // The host must be closed before asserting tracking 
      // Explicitly call host.Close or exit the using block to do this. 
     } 
     finally 
     { 
      if (host != null) 
      { 
       host.Tracking.Trace(TrackingOptions.All); 
      } 
     } 

IIS에서 워크 플로가 예상대로 실행됩니다.

감사합니다.

편집 :이 오류는 워크 플로 호스트 출력에 기록되는 : 난 그냥 당신을 Microsoft.Activities.UnitTesting 클래스를 WorkflowServiceTestHost입니다 실현되지했습니다

WorkflowInstance "Sequential Service" Unhandled Exception Source "Receive Process Message" 
Exception <System.NotSupportedException: Expression Activity type 'CSharpReference`1' requires compilation in order to run. 
Please ensure that the workflow has been compiled. 
at System.Activities.Expressions.CompiledExpressionInvoker.InvokeExpression(ActivityContext activityContext) 
at Microsoft.CSharp.Activities.CSharpReference`1.Execute(CodeActivityContext context) 
at System.Activities.CodeActivity`1.InternalExecuteInResolutionContext(CodeActivityContext context) 
at System.Activities.Runtime.ActivityExecutor.ExecuteInResolutionContext[T](ActivityInstance parentInstance, Activity`1 expressionActivity) 
at System.Activities.OutArgument`1.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance targetActivityInstance, ActivityExecutor executor) 
at System.Activities.RuntimeArgument.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance targetActivityInstance, ActivityExecutor executor, Object argumentValueOverride, Location resultLocation, Boolean skipFastPath) 
at System.Activities.ActivityInstance.InternalTryPopulateArgumentValueOrScheduleExpression(RuntimeArgument argument, Int32 nextArgumentIndex, ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Boolean isDynamicUpdate) 
at System.Activities.ActivityInstance.ResolveArguments(ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Int32 startIndex) 
at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)> 
+0

워크 플로우에 대한 C# 표현식을 아직 다루지 않았습니다. 어쨌든, 내가 잘못하지 않았다면 실행 전에 워크 플로를 컴파일해야합니다. [여기] (http://msdn.microsoft.com/en-us/library/jj591618.aspx)를 확인하십시오. 호스트 (AppFabric)는 이미 암시 적으로 컴파일하고 있기 때문에 IIS에서 실행 중일 수 있습니다.하지만 실제로는 'WorkflowServiceTestHost'에서 명시 적으로 수행해야합니다. – Joao

+0

실제로 테스트하려고하는 대상은 무엇입니까? WorkflowServiceTestHost 자체? –

+0

워크 플로우는 간단한 수신 활동과 두 가지 코드 활동으로 구성됩니다. 적어도 내가 알고있는 표현은 없습니다. WorkflowServiceTestHost가 아닌 Workflow를 테스트하려고합니다. 표시된 추적은 "host.Tracking.Trace (TrackingOptions.All);"에 의해 생성 된 WorkflowServiceTestHost 출력의 일부입니다. 다들 감사 해요! – JCS

답변

1

.

그럼 가능한지 알아 보겠습니다. source code에서 보았 듯이 XAMLX 파일 대신 WorkflowService의 개체 자체를 생성자에 전달할 수 있습니다. 이런 식으로 뭔가 :

// Load WorkflowService from .xamlx 
// Actually this is the method WorkflowserviceTestHost uses when you pass a 
// .xamlx so we're taking a step back to be able to compile the body 
var wfService = XamlServices.Load("c:\\workflowservice.xamlx") as WorkflowService; 

// Compile workflow body 
CompileExpressions(wfService.Body); 

// Now you can use WorkflowServiceTestHost 
using (host = new WorkflowServiceTestHost(wfService, serviceAddress)) 
{ 
    // ... do your thing 
} 

CompileExpressions이 앞서 당신을 준 link에서 가져옵니다.


즉, 단위 테스트로 WCF 서비스를 테스트하는 것은 이상한 것 같습니다. 단위 테스트는 서비스의 작은 활동에 중점을 두어야하며, 실제로 단위 테스트가 가능합니다. 통합 테스트 (또는 기능 테스트)는 모든 종속성 (IIS \ WAS, 네트워크, DB 등)으로 서비스를 테스트하는 곳입니다.

+0

감사합니다. 백만 명이 성공했습니다. WCF 테스트 방법에 대한 의견에 관해서는 개별 활동을 테스트해야한다는 데 동의하지만 활동을 사용하는 전체 방법을 단위 테스트의 일부로 테스트해야한다고 생각합니다. WF 워크 플로와 일반 클래스 메서드의 차이점은 무엇입니까? – JCS

+0

귀하의 요지를 보았지만 정상적인 워크 플로는 WCF 서비스 이상인 워크 플로 서비스와 다릅니다. 실제로 단위 테스트를 통해 웹 서비스를 테스트하고 있습니다. 그 나에게 이상하지만 나는 그것으로 살 수있다. 또한, Microsoft가 'WorkflowServiceTestHost'를 제공하면 내가 다르게 말할 수 있습니다. :) 다행했습니다! – Joao