2013-05-14 3 views
0

Я пытаюсь выполнить тестирование службы Workflow с помощью Microsoft.Activities.UnitTesting Целью является издеваться над расширениями службы, чтобы гарантировать выполнение всех шагов.Тестирование сервисов Workflow и Moq

Отмеченные объекты, похоже, не вызываются, хотя расширения зарегистрированы в хосте. Как и ожидалось, если расширения не зарегистрированы, генерируется исключение.

 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.

Спасибо!

Edit: Эта ошибка записывается в выходной Workflow Узла:

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). Он может выполняться в IIS, потому что хост (но это его, AppFabric?) Уже компилирует его неявно, но вы должны явно его использовать в своей «WorkflowServiceTestHost» – Joao

+0

. На самом деле вы пытаетесь протестировать? Сам WorkflowServiceTestHost? –

+0

Рабочий процесс состоит из простых операций приема и двух кодов; у него нет выражений, по крайней мере, я знаю. Я пытаюсь проверить Workflow, а не WorkflowServiceTestHost. Показанная трассировка является частью выходного документа WorkflowServiceTestHost, созданного «host.Tracking.Trace (TrackingOptions.All);». Спасибо вам всем! – JCS

ответ

1

Я только что понял, WorkflowServiceTestHost является Microsoft.Activities.UnitTesting класса, а не ваш.

Итак, давайте посмотрим, возможно ли это. Как я увидел на своем source code, вы можете передать конструктору только объект WorkflowService, а не файл XAMLX. Что-то вроде этого:

// 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, сеть, БД и т. Д.).

+0

Это сработало, спасибо миллион. Что касается комментария о тестировании методов WCF, я согласен с вами в том, что отдельные действия должны быть протестированы, но я также думаю, что общий метод, который использует эти действия, должен быть протестирован как часть модульных тестов. В чем разница между рабочим процессом WF и обычным методом класса? – JCS

+0

Я вижу вашу точку, но обычный рабочий процесс отличается от службы Workflow (это не более чем служба WCF). На самом деле вы тестируете веб-сервис посредством модульных тестов. Это странно для меня, но я могу жить с этим. Кроме того, если Microsoft предоставит вам «WorkflowServiceTestHost», кто я такой, чтобы сказать иначе :) Рад, что это сработало! – Joao

Смежные вопросы