Comment passer des objects dynamics dans une fonction NUnit TestCase?

J’écris une application gourmande en données. J’ai les tests suivants. Ils fonctionnent, mais ils sont plutôt redondants.

[Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InMerchantAggregateTotals_SetsWarning() { report.Merchants[5461324658456716].AggregateTotals.ItemCount = 0; report.Merchants[5461324658456716].AggregateTotals._volume = 0; report.Merchants[5461324658456716].AggregateTotals._houseGross = 1; report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x=> x is Reports.WarningObjects.ImbalancedVariables && x.mid == 5461324658456716 && x.lineitem == "AggregateTotals").Count() > 0); } [Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InAggregateTotals_SetsWarning() { report.AggregateTotals.ItemCount = 0; report.AggregateTotals._volume = 0; report.AggregateTotals._houseGross = 1; report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x=> x is Reports.WarningObjects.ImbalancedVariables && x.mid == null && x.lineitem == "AggregateTotals").Count() > 0); } [Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InAggregateTotalsLineItem_SetsWarning() { report.AggregateTotals.LineItem["WirelessPerItem"].ItemCount = 0; report.AggregateTotals.LineItem["WirelessPerItem"]._volume = 0; report.AggregateTotals.LineItem["WirelessPerItem"]._houseGross = 1; report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x=> x is Reports.WarningObjects.ImbalancedVariables && x.mid == null && x.lineitem == "WirelessPerItem").Count() > 0); } 

Les mêmes propriétés sont modifiées au début, de la même manière que les enfants de différents objects conteneurs, et un couple de valeurs dans la modification de l’assertion à la fin. Je dois en écrire quelques dizaines, en vérifiant différentes propriétés. Je veux donc paramétrer le test. L’astuce consiste à transmettre l’object conteneur en tant que paramètre au test. L’object conteneur est instancié dans le setout de test fixture.

Ce que je veux réaliser ressemblerait à ceci:

 [TestCase(report.AggregateTotals.LineItem["WirelessPerItem"], 0, "WirelessPerItem")] [TestCase(report.AggregateTotals, 4268435971532164, "AggregateTotals")] [TestCase(report.Merchants[5461324658456716].AggregateTotals, 5461324658456716, "WirelessPerItem")] [TestCase(report.Merchants[4268435971532164].LineItem["EBTPerItem"], 4268435971532164, "EBTPerItem")] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_TestCase_SetsWarning(object container, long mid, ssortingng field) { container.ItemCount = 0; container._volume = 0; container._houseGross = 1; report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x=> x is Reports.WarningObjects.ImbalancedVariables && x.mid == mid && x.lineitem == field).Count() > 0); } 

Mais cela ne fonctionne pas et je ne sais pas comment le faire fonctionner ou si c’est possible.

Je l’ai retrouvé. Je ne peux pas passer un object instancié dans un test via TestCase car les atsortingbuts sont ssortingctement réservés aux métadonnées statiques. Mais l’équipe NUnit a une solution pour cela, TestCaseSource. Le post sur la liste NUnit qui a répondu à la question est ici .

Voici à quoi ressemble maintenant ma solution:

 public IEnumerable CountEqualsZeroAndHouseGrossIsGreaterTestCases { get { Setup(); yield return new TestCaseData(report, report.Merchants[4268435971532164].LineItem["EBTPerItem"], 4268435971532164, "EBTPerItem").SetName("ReportMerchantsLineItem"); yield return new TestCaseData(report, report.Merchants[5461324658456716].AggregateTotals, 5461324658456716, "WirelessPerItem").SetName("ReportMerchantsAggregateTotals"); yield return new TestCaseData(report, report.AggregateTotals, null, "AggregateTotals").SetName("ReportAggregateTotals"); yield return new TestCaseData(report, report.AggregateTotals.LineItem["WirelessPerItem"], null, "WirelessPerItem").SetName("ReportAggregateTotalsLineItem"); } } [TestCaseSource("CountEqualsZeroAndHouseGrossIsGreaterTestCases")] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_TestCase_SetsWarning(Reports.ResidualsReport report, Reports.LineItemObject container, long? mid, ssortingng field) { container.ItemCount = 0; container._volume = 0; container._houseGross = 1; report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x=> x is Reports.WarningObjects.ImbalancedVariables && x.mid == mid && x.lineitem == field).Count() > 0); } 

Pas aussi beau que je l’espérais, pas aussi facile à lire. Mais il a réussi à réduire la duplication de code, ce qui devrait faciliter la maintenance et la correction.

Je passe des chaînes que j’parsing parfois, pense que ça se lit assez bien, exemple:

 [TestCase("15°", "-10°", 25, typeof(Degrees))] [TestCase("-10°", "15°", -25, typeof(Degrees))] [TestCase("-10°", "0°", -10, typeof(Degrees))] [TestCase("-90°", "1.5707 rad", -3.1414, typeof(Radians))] [TestCase("1.5707 rad", "-90°", 3.1414, typeof(Radians))] [TestCase("1.5707 rad", "1.5707 rad", 0, typeof(Radians))] public void SubtractionTest(ssortingng lvs, ssortingng rvs, double ev, Type et) { var lv = Angle.Parse(lvs); var rv = Angle.Parse(rvs); var diff = lv - rv; Assert.AreEqual(ev, diff.Value, 1e-3); Assert.AreEqual(et, diff.Unit.GetType()); } 

Ne serait-il pas beaucoup plus facile d’avoir une méthode privée, une méthode de classe de base ou des classes d’aide qui le font pour vous?

Pour mes tests unitaires, j’ai besoin de beaucoup d’entités simulées car c’est une application très gourmande en données. J’ai créé une structure de référentiels fictifs pouvant créer des entités initialisées à la volée, que je peux combiner pour constituer une structure de firebase database représentative en mémoire.

Quelque chose comme ça pourrait fonctionner pour vous:

 // Wild guess at the class name, but you get the idea private void InitializeTotals(AggregateItem item) { item.ItemCount = 0; item._volume = 0; item._houseGross = 1; } [Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InMerchantAggregateTotals_SetsWarning() { InitializeTotals(report.Merchants[5461324658456716].AggregateTotals); report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x => x is Reports.WarningObjects.ImbalancedVariables && x.mid == 5461324658456716 && x.lineitem == "AggregateTotals").Count() > 0); } [Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InAggregateTotals_SetsWarning() { InitializeTotals(report.AggregateTotals); report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x => x is Reports.WarningObjects.ImbalancedVariables && x.mid == null && x.lineitem == "AggregateTotals").Count() > 0); } [Test] public void DoSanityCheck_WithCountEqualsZeroAndHouseGrossIsGreater_InAggregateTotalsLineItem_SetsWarning() { InitializeTotals(report.AggregateTotals.LineItem["WirelessPerItem"]); report.DoSanityCheck(); Assert.IsTrue(report.FishyFlag); Assert.That(report.DataWarnings.Where(x => x is Reports.WarningObjects.ImbalancedVariables && x.mid == null && x.lineitem == "WirelessPerItem").Count() > 0); }