web-dev-qa-db-fra.com

Comment utiliser Exclure dans FluentAssertions pour une propriété en collection?

J'ai deux classes:

public class ClassA
{
  public int? ID {get; set;}
  public IEnumerable<ClassB> Children {get; set;}
}

public class ClassB
{
  public int? ID {get; set;}
  public string Name {get; set;}
}

Je veux utiliser des assertions fluides pour comparer avec les instances ClassA. Cependant, je veux ignorer les ID (car les ID auront été attribués après la sauvegarde).

Je sais que je peux le faire:

expectedA.ShouldBeEquivalentTo(actualA, options => options.Excluding(x => x.PropertyPath == "Children[0].ID"));

Ce que je peux évidemment répéter pour chaque classe B de la collection. Cependant, je cherche un moyen d'exclure tous les ID (plutôt que de faire une exclusion pour chaque élément).

J'ai lu cette question cependant si je supprime les indexeurs [0] les assertions échouent.

Est-ce possible?

35
Liath

Qu'en est-il de?

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => 
   (su.RuntimeType == typeof(ClassB)) && (su.PropertyPath.EndsWith("Id")));`

Ou vous pouvez faire une correspondance RegEx sur le chemin de la propriété, comme

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => (Regex.IsMatch
   ("Children\[.+\]\.ID"));

En fait, j'aime ce dernier, mais le truc regex le rend un peu difficile à lire. Je devrais peut-être étendre ISubjectInfo avec une méthode pour faire correspondre le chemin par rapport à un modèle générique, afin que vous puissiez faire ceci:

expected.ShouldBeEquivalentTo(actualA, options => options
  .Excluding(su => su.PathMatches("Children[*].ID")));
38
Dennis Doomen

Je viens de rencontrer un problème similaire et la dernière version de FluentAssertions a un peu changé les choses.

Mes objets contiennent des dictionnaires d'autres objets. Les objets des dictionnaires contiennent d'autres objets que je souhaite exclure. Le scénario que j'ai consiste à tester la sérialisation Json où j'ignore certaines propriétés.

Cela fonctionne pour moi:

gotA.ShouldBeEquivalentTo(expectedB , config => 
  config
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Venue))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Exhibit))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Content))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Survey))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Media))
  );

Il a fallu un certain temps pour savoir comment le faire, mais c'est vraiment utile!

22
Nick Randell

Un moyen simple serait de définir directement des assertions sur la collection, combinées à son exclusion sur l'assertion d'équivalence ClassA:

expectedA.ShouldBeEquivalentTo(expectedB,
   o => o.Excluding(s => s.PropertyInfo.Name == "Children"));
expectedA.Children.ShouldBeEquivalentTo(expectedB.Children,
   o => o.Excluding(s => s.PropertyInfo.Name = "Id"));
8
k.m

Basé sur l'idée de correspondance RegEx de réponse de Dennis Doomen J'ai pu le faire fonctionner

expected.ShouldBeEquivalentTo(actualA, options =>
  options.Excluding(su => 
     (Regex.IsMatch(su.SelectedMemberPath, "Children\\[.+\\].ID"));

Différence avec la réponse de Dennis: passage su.SelectedMemberPath, doubles barres obliques pour échapper aux crochets.

Le moyen le plus simple est:

expected.ShouldBeEquivalentTo(actual, config => config.ExcludingMissingMembers());
0
Michał Chudzik