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)>
워크 플로우에 대한 C# 표현식을 아직 다루지 않았습니다. 어쨌든, 내가 잘못하지 않았다면 실행 전에 워크 플로를 컴파일해야합니다. [여기] (http://msdn.microsoft.com/en-us/library/jj591618.aspx)를 확인하십시오. 호스트 (AppFabric)는 이미 암시 적으로 컴파일하고 있기 때문에 IIS에서 실행 중일 수 있습니다.하지만 실제로는 'WorkflowServiceTestHost'에서 명시 적으로 수행해야합니다. – Joao
실제로 테스트하려고하는 대상은 무엇입니까? WorkflowServiceTestHost 자체? –
워크 플로우는 간단한 수신 활동과 두 가지 코드 활동으로 구성됩니다. 적어도 내가 알고있는 표현은 없습니다. WorkflowServiceTestHost가 아닌 Workflow를 테스트하려고합니다. 표시된 추적은 "host.Tracking.Trace (TrackingOptions.All);"에 의해 생성 된 WorkflowServiceTestHost 출력의 일부입니다. 다들 감사 해요! – JCS