gpt4 book ai didi

workflow-foundation - 在单元测试期间断言 WF 服务变量的值

转载 作者:行者123 更新时间:2023-12-02 23:49:35 26 4
gpt4 key购买 nike

我需要断言工作流服务中变量的值。

我已经下载并正在使用 CodePlex 中的 Microsoft.Activities.UnitTesting 框架来测试工作流服务端点、返回值和流程逻辑 - 但我需要在调用端点后验证变量的值,并且得到回应 - 这可能吗?

如果不是,是否有其他类型的解决方法可能有效,但涉及更改工作流程本身以生成输出参数?因为在生产时我肯定不需要它。

谢谢!

更新2.A

目前使用 stub 方法而不是 WCF 方法来测试服务。

[TestMethod]
[DeploymentItem(@"TestService\Service1.xamlx")]
public void TestValueOfInteger1AfterStart()
{
// inject the mocks into the service
var xamlInjector = new XamlInjector("Service1.xamlx");
xamlInjector.ReplaceAll(typeof(Receive), typeof(ReceiveStub));
xamlInjector.ReplaceAll(typeof(SendReply), typeof(SendReplyStub));

// setup the messages
var stubExtension = new MessagingStubExtension();

// enqueue a message for the receive activity using parameters content
stubExtension.EnqueueReceive(XName.Get("{http://tempuri.org/}IService"), "Start", null);

// setup the host
var host = WorkflowInvokerTest.Create(xamlInjector.GetWorkflowService().Body);
host.Extensions.Add(stubExtension);

try
{
host.TestActivity();
...

更新2.B

因此,经过更多努力,我发现如果使用 stub ,我可以通过反射恢复上下文,而不是使用 WCF 端点进行单元测试。上面是 stub 单元测试代码的摘录,下面是我用来获取刷新的 ActivityContext 的反射代码。但是,现在我在尝试获取变量的值时遇到以下错误。

有趣的是,您可以清楚地看到上下文所绑定(bind)的事件就是定义它的事件 - 糟糕的框架只是有点困惑。

Exception when trying to grab the variable value.

...
const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;

// recover the WorkflowInstance
var proxy = stubExtension.GetType().GetProperty("InstanceProxy",
bindingFlags).GetValue(stubExtension,
bindingFlags,
null,
null,
null) as WorkflowInstanceProxy;

// recover the WorkflowInstance
var fieldInfo = proxy.GetType().GetField("instance", bindingFlags);
var workflowInstance = fieldInfo.GetValue(proxy) as WorkflowApplication;

// recover the ActivityExecutor
fieldInfo = workflowInstance.GetType().BaseType.GetField("executor", bindingFlags);
dynamic activityExecutor = fieldInfo.GetValue(workflowInstance);

// recover the rootInstance
fieldInfo = activityExecutor.GetType().GetField("rootInstance", bindingFlags);
var rootInstance = fieldInfo.GetValue(activityExecutor) as ActivityInstance;

// recover the cachedResolutionContext
fieldInfo = activityExecutor.GetType().GetField("cachedResolutionContext", bindingFlags);
var cachedResolutionContext = fieldInfo.GetValue(activityExecutor) as ActivityContext;

MethodInfo methodInfo = cachedResolutionContext.GetType().GetMethod("Reinitialize", bindingFlags);
methodInfo.Invoke(cachedResolutionContext, bindingFlags, null, new object[]
{
rootInstance,
activityExecutor
}, null);

var val = (int)((Sequence)rootInstance.Activity).Variables.First(x => x.Name == "integer1").Get(cachedResolutionContext);
Assert.AreEqual(val, 1, "The integer value of integer1 is not correct.");

最佳答案

您可以使用 AppFabric 跟踪并监视变量。

但是,这个问题提出了进一步的问题:如果您已经在测试流程逻辑和输出,为什么还需要测试 wf 实例的内部状态?

关于workflow-foundation - 在单元测试期间断言 WF 服务变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9672878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com