FakeXRMEasy: использование AddFakeMessageExecutor для переопределения поведения запроса на обновление - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь создать тест для ситуации, когда запрос на обновление выдает исключение. Можно ли это сделать с помощью 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);

Я хотел, чтобы это выдало исключение, но в данный момент запрос на обновление завершается успешно. Как я могу сделать эту работу?

1 Ответ

1 голос
/ 08 апреля 2019

IFakeMessageExecutor работает только при вызове метода IOrganizationService.Execute. Таким образом, если вы измените service.Update(entity); строку кода для service.Execute(new UpdateRequest { Target = entity});, она должна работать.

Вот полный рабочий пример для справки:

CodeActivity

    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);
        }
    }

Test (используется библиотека xUnit test lib)

    [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));
    }
...