gpt4 book ai didi

c# - FakeXRMEasy:使用 AddFakeMessageExecutor 覆盖更新请求行为

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:00 24 4
gpt4 key购买 nike

我正在尝试针对更新请求引发异常的情况创建测试。使用 FakeXRMEasy 可以做到这一点吗?我试过使用 AddFakeMessageExecutor,但目前它不起作用:

我的假消息执行器类:

public class UpdateExecutor : IFakeMessageExecutor
{
public bool CanExecute(OrganizationRequest request)
{
return request is UpdateRequest;
}

public OrganizationResponse Execute(
OrganizationRequest request,
XrmFakedContext ctx)
{
throw new Exception();
}

public Type GetResponsibleRequestType()
{
return typeof(UpdateRequest);
}
}

在测试中使用:

fakeContext.Initialize(new Entity[] { agreement });
fakeContext.AddFakeMessageExecutor<UpdateRequest>(new UpdateExecutor());

fakeContext.ExecuteCodeActivity<AgreementConfirmationWorkflow>(fakeContext.GetDefaultWorkflowContext());

并且在工作流中调用更新请求:

var workflowContext = executionContext.GetExtension<IWorkflowContext>();
var serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(workflowContext.UserId);

/// some code to retrieve entity and change attributes ///

service.Update(entity);

我希望这会引发异常,但此时更新请求已成功完成。我怎样才能使它工作?

最佳答案

IFakeMessageExecutor 仅在您调用 IOrganizationService.Execute 方法时起作用。因此,如果您将 service.Update(entity); 行代码更改为 service.Execute(new UpdateRequest { Target = entity}); 它应该可以工作。

这是一个完整的工作示例以供引用:

代码事件

    public class RandomCodeActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
var workflowContext = context.GetExtension<IWorkflowContext>();
var serviceFactory = context.GetExtension<IOrganizationServiceFactory>();
var service = serviceFactory.CreateOrganizationService(workflowContext.UserId);

var accountToUpdate = new Account() { Id = new Guid("e7efd527-fd12-48d2-9eae-875a61316639"), Name = "A new faked name!" };

service.Execute(new UpdateRequest { Target = accountToUpdate });
}
}

FakeMessageExecutor 实例

    public class FakeUpdateRequestExecutor : IFakeMessageExecutor
{
public bool CanExecute(OrganizationRequest request)
{
return request is UpdateRequest;
}

public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
{
throw new InvalidPluginExecutionException("Throwing an Invalid Plugin Execution Exception for test purposes");
}

public Type GetResponsibleRequestType()
{
return typeof(UpdateRequest);
}
}

测试(使用 xUnit 测试库)

    [Fact]
public void UpdateAccount_WithUpdateExecutorThrowingAnException_ExceptionThrown()
{
//Assign
var context = new XrmFakedContext
{
ProxyTypesAssembly = Assembly.GetAssembly(typeof(Account))
};

var account = new Account() { Id = new Guid("e7efd527-fd12-48d2-9eae-875a61316639"), Name = "Faked Name" };

context.Initialize(new List<Entity>() { account });
context.AddFakeMessageExecutor<UpdateRequest>(new FakeUpdateRequestExecutor());
var service = context.GetOrganizationService();

//Act


//Assert
Assert.Throws<InvalidPluginExecutionException>(() => context.ExecuteCodeActivity<RandomCodeActivity>(account));
}

关于c# - FakeXRMEasy:使用 AddFakeMessageExecutor 覆盖更新请求行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524986/

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