2017-06-30 1 views
0

donc je le code suivant pour un test unitaire en utilisant NUnit 3 en C#:NUnit CollectionOrderedConstraint jette exception NullReference sur un champ readonly public non nul

var skills = new[] 
{ 
    new Skill("aaaa"), //parameter is Name 
    new Skill("kkkk"), //parameter is Name 
    new Skill("zzzz"), //parameter is Name 
}; 

Assert.That(skills, Is.All.Not.Null); 

var skillNames = skills.Select(s => s.Name); 
Assert.That(skillNames, Is.All.Not.Null); 
Assert.That(skillNames, Contains.Item("aaaa")); 
Assert.That(skillNames, Contains.Item("kkkk")); 
Assert.That(skillNames, Contains.Item("zzzz")); 

Assert.That(skills, Is.Ordered.By("Name")); //Fails 

Quand il arrive à l'affirmation Ordered, il échoue et jette NullReferenceException: Object reference not set to an instance of an object. à partir de CollectionOrderedConstraint.Matches(IEnumerable actual). Évidemment, les valeurs ne sont pas nulles. Ceci est vérifié par le passage de test suivant avec succès:

var skillNames = new[] 
{ 
    new Skill("aaaa").Name, 
    new Skill("kkkk").Name, 
    new Skill("zzzz").Name, 
}; 

Assert.That(skillNames, Is.Ordered); //Passes 

Je sais que la question n'est pas avec la contrainte By, comme ce test passe aussi:

var characters = new[] 
{ 
    new Character { InterestingTrait = "aaaa" }, 
    new Character { InterestingTrait = "kkkk" }, 
    new Character { InterestingTrait = "zzzz" }, 
}; 

Assert.That(characters, Is.Ordered.By("InterestingTrait")); //Passes 

La seule différence que je connaisse entre le défaut cas et les cas de passage est que dans le cas de l'échec, le champ que nous vérifions est un champ public readonly. Pourquoi cela déclencherait-il une exception de référence nulle? Y at-il un problème connu avec ceci dans NUnit?

+2

Pourriez-vous donner cela sous la forme d'un [mcve] afin que nous puissions le reproduire pour nous-mêmes facilement? –

Répondre

1

Ce n'est pas un problème avec le membre étant readonly, juste le fait que c'est un champ, pas une propriété. Pour contourner ce, mettez votre champ à une propriété en lecture seule,

public string Name { get; } 

Si vous lisez le NUnit documentation for CollectionOrderedConstraint, ou de regarder la signature pour By(string propertyName), vous remarquerez que les propriétés sont uniquement mentionnées. NUnit devrait probablement gérer les champs publics ou donner un meilleur message d'erreur, donc je vais entrer un problème.

Mise à jour: Je suis entré dans la question https://github.com/nunit/nunit/issues/2292

+0

Cela a effectivement résolu le problème, en changeant les valeurs des champs en propriétés. Merci! – cidthecoatrack