Hi,
Just sharing a sample code to test a custom workflow activity using Microsoft Fakes.
The custom workflow activity uses LINQ.
The custom workflow activity code
public sealed class MyCustomWorkflowActivity : CodeActivity { #region Public Properties [Input("Stage Name")] public InArgument<string> StageName { get; set; } #endregion #region Methods /// <summary> /// Executes the workflow activity. /// </summary> /// <param name="executionContext"> /// The execution context. /// </param> protected override void Execute(CodeActivityContext executionContext) { // Create the tracing service var tracingService = executionContext.GetExtension<ITracingService>(); // Create the context var context = executionContext.GetExtension<IWorkflowContext>(); var serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); try { using (var xrmServiceContext = new XrmServiceContext(service)) { // get the business process workflow id var workflow = (from w in xrmServiceContext.WorkflowSet where w.Name == "Business Process Workflow Name" select new Workflow { WorkflowId = w.WorkflowId }).FirstOrDefault(); if (workflow != null) { // get the stage name from the context's input parameter var stageName = this.StageName.Get<string>(executionContext); var stage = (from s in xrmServiceContext.ProcessStageSet where s.StageName == stageName && s.ProcessId.Id == workflow.WorkflowId select new ProcessStage { ProcessStageId = s.ProcessStageId }).FirstOrDefault(); if (stage != null) { // update the sales state in the case record to which the above business process flow is associated var incident = new Incident { Id = context.PrimaryEntityId, StageId = stage.ProcessStageId }; service.Update(incident); } } } } catch (FaultException<OrganizationServiceFault> e) { tracingService.Trace("Exception: {0}", e.ToString()); throw; } }
Unit Test Code
public void UnitTestCustomWorkflowActivity() { var workflowUserId = Guid.NewGuid(); var workflowCorrelationId = Guid.NewGuid(); var workflowInitiatingUserId = Guid.NewGuid(); var service = new Microsoft.Xrm.Sdk.Fakes.StubIOrganizationService(); var workflowContext = new Microsoft.Xrm.Sdk.Workflow.Fakes.StubIWorkflowContext(); workflowContext.UserIdGet = () => { return workflowUserId; }; workflowContext.CorrelationIdGet = () => { return workflowCorrelationId; }; workflowContext.InitiatingUserIdGet = () => { return workflowInitiatingUserId; }; // ITracingService var tracingService = new Microsoft.Xrm.Sdk.Fakes.StubITracingService(); tracingService.TraceStringObjectArray = (f, o) => { Debug.WriteLine(f, o); }; // IOrganizationServiceFactory var factory = new Microsoft.Xrm.Sdk.Fakes.StubIOrganizationServiceFactory(); factory.CreateOrganizationServiceNullableOfGuid = id => { return service; }; SetBpfStage target = new SetBpfStage(); var wfEntity = new Workflow(); wfEntity.Id = Guid.NewGuid(); wfEntity["name"] = "abcabcabc"; var wfEntity1 = new Workflow(); wfEntity1.Id = Guid.NewGuid(); wfEntity1["name"] = "abcabcabc"; var processStageEntity = new ProcessStage(); processStageEntity.Id = Guid.NewGuid(); processStageEntity["name"] = "abcabcabc"; service.ExecuteOrganizationRequest = r => { RetrieveMultipleResponse response = null; if (((Microsoft.Xrm.Sdk.Query.QueryExpression)((RetrieveMultipleRequest)r).Query).EntityName == "workflow") { List<Entity> entities = new List<Entity> { wfEntity }; response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection (entities) } } }; return response; } if (((Microsoft.Xrm.Sdk.Query.QueryExpression)((RetrieveMultipleRequest)r).Query).EntityName == "processstage") { List<Entity> entities = new List<Entity> { processStageEntity }; response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection (entities) } } }; return response; } return response; }; service.UpdateEntity = (p) => { }; var invoker = new WorkflowInvoker(target); invoker.Extensions.Add<ITracingService>(() => tracingService); invoker.Extensions.Add<IWorkflowContext>(() => workflowContext); invoker.Extensions.Add<IOrganizationServiceFactory>(() => factory); var inputs = new Dictionary<string, object> { { "StageName", "New" } }; invoker.Invoke(inputs); }
Hope it helps..
Reblogged this on Mahender Pal and commented:
Unit Testing using Microsoft Fakes
LikeLike
Reblogged this on Exploring MS CRM and commented:
MSCRM Testing- Using Microsoft Fakes
LikeLike