单元测试代码活动工作流程

Unit Testing Codeactivity Workflow

我正在尝试为 CodeActivity 工作流编写单元测试。到目前为止我的测试只有

[TestMethod]
public void BusinessUnitTest()
{
    WorkflowInvoker invoker = new WorkflowInvoker(new DespatchStockOrder());
    invoker.Extensions.Add<ITracingService>(() => tracingService);
    invoker.Extensions.Add<IWorkflowContext>(() => workflowContext);
    invoker.Extensions.Add<IOrganizationServiceFactory>(() => factory);
    IDictionary<string, object> outputs = invoker.Invoke();
}

这工作正常并运行工作流程。但是,当我在工作流程中点击这一行时,我得到了一个空引用。

// Create the context
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();

if (context == null)
{
     throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
}

Entity entity = new Entity(context.PrimaryEntityName) //This line errors with PrimaryEntityName null
{
     Id = context.PrimaryEntityId,
     LogicalName = context.PrimaryEntityName
};

我的问题是如何在单元测试中获得 context.PrimaryEntityName 值

如果您手动构建上下文,则需要在 [TestMethod] 中填充 PrimaryEntityName。您可能应该进一步研究 workflowContext 测试对象的构造方式。

[TestMethod]
public void BusinessUnitTest()
{
    workflowContext.PrimaryEntityName = "Entity name";

    WorkflowInvoker invoker = new WorkflowInvoker(new DespatchStockOrder());
    invoker.Extensions.Add<ITracingService>(() => tracingService);
    invoker.Extensions.Add<IWorkflowContext>(() => workflowContext);
    invoker.Extensions.Add<IOrganizationServiceFactory>(() => factory);
    IDictionary<string, object> outputs = invoker.Invoke();
}

您可能想试试 FakeXrmEasy。这是一个开源单元测试库,我正在维护以促进 Dynamics Crm 的单元测试,而无需模拟任何东西。

get a reference to a workflow context 并注入您需要的任何参数,包括主要实体名称和 ID。

但是最常见的 crm 消息已经被模拟(检索多个请求、CRUD、fetchxml、LINQ、QueryExpressions 等等……)