1

Comment créer une entité et lui associer une autre entité dans FakeXrmEasy?créer des données liées avec fakexrmeasy

Je cherche à tester ce code:

public List<abc_OrderTask> GetTasks(Guid workOrderGuid) 
    { 
     var result = (from task in _xrmServiceContext.abc_OrderTaskSet 
         join workOrder in _xrmServiceContext.abc_workorderSet 
               on task.RegardingObjectId.Id equals workOrder.Id 
         where workOrder.Id == workOrderGuid 
         select task).ToList(); 

     return result; 
    } 

Relation entre abc_OrderTask et abc_WorkOrder est N: 1

Dans mon test, je tente de relier les deux entités:

[Test] 
    public void GetTasks_WorkOrderWithExistingTasks_ReturnsListOfTasks() 
    { 
     using (var xrmServiceContext = new XrmServiceContext(_fakeOrganizationService)) 
     { 
      var workOrderGuid = Guid.NewGuid(); 
      var taskGuid = Guid.NewGuid(); 
      var workOrder = new abc_workorder { Id = workOrderGuid }; 
      var task = new abc_OrderTask 
          { 
           Id = taskGuid, 
           Subject = "Required subject", 
           RegardingObjectId = 
            new EntityReference(abc_workorder.EntityLogicalName, workOrderGuid) 
          }; 
      _fakeContext.Initialize(new List<Entity> { workOrder, task }); 

      var sut = new WorkOrderService(xrmServiceContext); 

      // Act 
      // Assert 
      Assert.That(sut.GetTasks(workOrderGuid), Is.InstanceOf<List<abc_OrderTask>>()); 
      Assert.That(sut.GetTasks(workOrderGuid).Count.Equals(1)); 
     } 
    } 

Toutefois, le jeu de résultats est vide.

Comment créer une entité et lui associer une autre entité dans FakeXrmEasy?

Voilà comment cet objet devient nouveau-ed up:

private IOrganizationService _fakeOrganizationService; 

    [SetUp] 
    public void Init() 
    { 
     _fakeContext = new XrmFakedContext { ProxyTypesAssembly = Assembly.GetAssembly(typeof(abc_workorder)) }; 
     _fakeOrganizationService = _fakeContext.GetFakedOrganizationService(); 
    } 
+0

Où est '_fakeContext' viens? Comment est-il lié à '_fakeOrganizationService'? J'ajouterais le code où vous les définissez. J'ai quelques exemples à https://github.com/nicknow/BloggingCrm-Dynamics-Crm-Plugin-Unit-Testing-Example/blob/master/BloggingCrm.Account.BusinessLogic.Tests/Prove_that_AccountQueries_Is_Working.cs de comment j'ai utilisé FakeXrmEasy pour faites ce type de test. – Nicknow

+0

merci @Nicknow j'ai ajouté cela à la question –

+0

merci mais je n'ai pas pu trouver un exemple utile dans votre github –

Répondre

3

abc_OrderTask est une activité personnalisée. Les activités sont des enregistrements enfants de leur objet (abc_workorder) défini par abc_OrderTask.RegardObjectId. Il semble que cela soit correctement configuré dans vos données de test. La méthode testée, GetTasks, interroge en fonction d'une relation N: 1 personnalisée de abc_workorder à abc_OrderTask avec le champ de recherche nommé abc_workorder_abc_OrderTasks.

Vous devez corriger GetTasks pour filtrer abc_OrderTask par RegardingObjectId.Id.

+0

merci beaucoup, j'ai mis à jour la question avec votre suggestion et je reçois toujours le jeu de résultats vide –

-1

Deux options:

  1. Votre WorkOrderService a un bogue, et votre test unitaire fonctionne parfaitement.

  2. Le framework FakeXrmEasy a un bug. Je changerais votre test juste pour récupérer le abc_OrderTask et vérifier qu'il a un RegardingObjectId. Si c'est le cas, mais que la jointure ne fonctionne pas, soumettez vos résultats sur la page GitHub comme un bug.

2

Merci à tous pour toutes les réponses :)

Ça va être beaucoup plus rapide plus facile & à répondre par raising an issue with a unit test on the GitHub page afin que nous puissions construire et exécuter le test unitaire et de voir ce qui se passe. Quoi qu'il en soit, je dirais que Nicknow est la bonne réponse car vous essayez de filtrer les enregistrements dans l'expression LINQ en utilisant la propriété 1-> N plutôt que ce que je faisais, ce qui est exactement le contraire, en filtrant par le EntityReference (RegardingObjectId.Id) comme Nick suggérait. Fondamentalement, vous pouvez filtrer les requêtes 1: N en utilisant la recherche associée, comme contact.ParentCustomerId.Id, etc. Et N: N enregistrements en utilisant l'entité intersection, avec leurs recherches associées. Cela devrait fonctionner pour LINQ, QueryExpressions et FetchXml.

Espérons que cela aide!

[EDIT]: Comme FakeXrmEasy est également l'unité elle-même testé, vous find loads of different query examples here