Just sharing the helper class we use for writing Unit Test for Plugin using Microsoft Fakes
Sample Code for Plugin
</pre> public class PluginClass: IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); // Everytime a lead record is created // Create a corresponding contact record if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { Entity entity = (Entity)context.InputParameters["Target"]; IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService orgService = serviceFactory.CreateOrganizationService(context.UserId); if (entity.LogicalName == "lead") { Entity contactEntity = new Entity("contact"); contactEntity.Attributes["lastname"] = entity.Attributes["subject"]; orgService.Create(contactEntity); } } } }
Sample Code for Unit Test Class
</pre> [TestClass] public class UnitTest1 { [TestMethod] public void UnitTestMethod() { var serviceProvider = new StubIServiceProvider(); var pluginContext = new StubIPluginExecutionContext(); var organizationService = new StubIOrganizationService(); // Mole the basic Plugin objects Helper.FakePluginVariables(serviceProvider, pluginContext, organizationService, 40, "Create"); // set the mole of entity var entityAttributes = new Dictionary<string, object>(); entityAttributes.Add("subject", "Test Subject"); Entity leadEntity = Helper.FakeEntity("lead", entityAttributes, pluginContext); // set the entity in the parameter collection var parameterAttributes = new Dictionary<string, object>(); parameterAttributes.Add("Target", leadEntity); Helper.FakePluginInputParameters(pluginContext, parameterAttributes); organizationService.CreateEntity = (p1) => { return Guid.NewGuid(); }; var postCreateLead = new Class1(); postCreateLead.Execute(serviceProvider); } }
Helper class
</pre> /// <summary> /// Helper class for Fakes /// </summary> public static class Helper { /// <summary> /// Fakes the plugin variables. /// </summary> /// <param name="serviceProvider">The service provider.</param> /// <param name="pluginContext">The plugin context.</param> /// <param name="organizationService">The organization service.</param> /// <param name="stageNumber">The stage number.</param> /// <param name="messageName">Name of the message.</param> public static void FakePluginVariables( StubIServiceProvider serviceProvider, StubIPluginExecutionContext pluginContext, StubIOrganizationService organizationService, int stageNumber, string messageName) { var serviceFactory = new StubIOrganizationServiceFactory(); var tracingService = new StubITracingService(); if (serviceProvider != null) { serviceProvider.GetServiceType = type => { if (type == typeof(IPluginExecutionContext)) { return pluginContext; } else if (type == typeof(ITracingService)) { return tracingService; } else if (type == typeof(IOrganizationServiceFactory)) { return serviceFactory; } return null; }; } pluginContext.DepthGet = () => 1; pluginContext.UserIdGet = () => new Guid(); pluginContext.MessageNameGet = () => messageName; pluginContext.StageGet = () => stageNumber; pluginContext.InitiatingUserIdGet = () => new Guid(); pluginContext.CorrelationIdGet = () => new Guid(); pluginContext.PrimaryEntityIdGet = Guid.NewGuid; serviceFactory.CreateOrganizationServiceNullableOfGuid = t1 => organizationService; tracingService.TraceStringObjectArray = Trace; } /// <summary> /// Sets the Fakes for the Entity /// </summary> /// <param name="entityName">The LogicalName of the entity</param> /// <param name="attributeValues">The attributes of the entity</param> /// <param name="context">Object of type SIPluginExecutionContext</param> /// <returns>Object of type Entity</returns> public static Entity FakeEntity(string entityName, Dictionary<string, object> attributeValues, StubIPluginExecutionContext context) { var entity = new Entity(entityName); entity.Attributes = new AttributeCollection(); if (attributeValues != null) { foreach (string key in attributeValues.Keys) { entity.Attributes.Add(key, attributeValues[key]); } } if (context != null) { context.PrimaryEntityNameGet = () => entityName; } entity.Id = Guid.NewGuid(); return entity; } /// <summary> /// Fakes the PluginContext.InputParameters /// </summary> /// <param name="context">the mole of the IPluginExecutionContext</param> /// <param name="inputParameterCollection">Object of type System.Dictionary</param> public static void FakePluginInputParameters(StubIPluginExecutionContext context, Dictionary<string, object> inputParameterCollection) { if (inputParameterCollection != null) { var parameterCollection = new ParameterCollection(); foreach (var key in inputParameterCollection.Keys) { parameterCollection.Add(key, inputParameterCollection[key]); } if (context != null) { context.InputParametersGet = () => parameterCollection; } } } /// <summary> /// Detour method for the CRM Trace method /// </summary> /// <param name="content">the message to be traced</param> /// <param name="value">Object of type object []</param> public static void Trace(string content, params object[] value) { } }
// Update organizationService.UpdateEntity = (p) => { }; // Execute organizationService.ExecuteOrganizationRequest = orgReq => { return new OrganizationResponse(); }; // Retrieve organizationService.RetrieveStringGuidColumnSet = (p1, p2, p3) => { Entity entity = null; if (p1 == entity1.EntityLogicalName) { entity = new Entity(entity1.EntityLogicalName); entity.Id = Guid.NewGuid(); entity.Attributes["new_category"] = new OptionSetValue(12345); entity.FormattedValues["new_category"] = "home"; } else if (p1 == entity2.EntityLogicalName) { entity = new Entity(entity2.EntityLogicalName); entity.Id = Guid.NewGuid(); entity.Attributes["new_moneyattr"] = new Money(100.0M); } return entity; }; //RetrieveMultiple organizationService.RetrieveMultipleQueryBase = delegate(QueryBase query) { var collection = new EntityCollection(); Entity entity; if (query is FetchExpression) { entity = new Entity(entity.EntityLogicalName); entity.Attributes = new AttributeCollection(); entity.Attributes.Add("attr", "value"); collection.Entities.Add(entity); } return collection; }; // PreImage pluginContext.PreEntityImagesGet = () => { EntityImageCollection entityImgColl = new EntityImageCollection(); Entity preImageEntity = new Entity(enitity1.EntityLogicalName); preImageEntity.Attributes.Add("new_id", new EntityReference(entity2.EntityLogicalName, Guid.NewGuid())); preImageEntity.Attributes.Add("new_bool", false); KeyValuePair<string, Entity> kvp = new KeyValuePair<string, Entity>("PreImageAI", preImageEntity); entityImgColl.Add(kvp); return entityImgColl; };
Hope it helps
Such a great post, this saved me today…. Thanks alot.
LikeLike
Glad it hellped. Thanks for taking the time to comment.
LikeLike