Je veux tester le code suivant :
public IEnumerable> ValidateAll()
{
//...faire quelque chose
var invalidFacts = GetInvalidFacts();
//...faire quelque chose
return duplicateFacts.Concat(invalidFacts);
}
private IEnumerable> GetInvalidFacts()
{
var invalidFacts = Facts.Select(fact =>
{
try
{
fact.Validate();
return new KeyValuePair(fact, null);
}
catch (FormatException e)
{
return new KeyValuePair(fact, e);
}
catch (Exception e)
{
return new KeyValuePair(fact, e);
}
}).Where(kv => kv.Value != null).ToList();
return invalidFacts;
}
Essentiellement, l'objectif du test est de vérifier que tous les objets qui existent dans l'ensemble "Facts" appelleront leur méthode Validate. Comme je ne souhaite pas tester le code à l'intérieur de ces objets, car il existe déjà de nombreux tests qui le font, je veux injecter une liste de fausses données. J'utilise MOQ pour créer les fausses données.
Ainsi, mon test unitaire ressemble à ceci :
[TestMethod]
public void ValidateAll_ValidateMethodIsInvokedOnAllFacts_WhenCalled()
{
var anyFactOne = new Mock(); //Fact est une classe abstraite.
anyFactOne.Setup(f => f.Validate());
var dataWarehouseFacts = new DataWarehouseFacts { Facts = new Fact[] { anyFactOne.Object, FactGenerationHelper.GenerateRandomFact() } };
dataWarehouseFacts.ValidateAll();
}
Maintenant, je reçois une exception car le code valide en réalité le type de Faits qui peut être injecté dans la classe DataWarehouseFacts, comme suit :
public IEnumerable Facts
{
get
{
.....
}
set
{
var allowedTypes = new []
{
typeof(ProductUnitFact),
typeof(FailureFact),
typeof(DefectFact),
typeof(ProcessRunFact),
typeof(CustomerFact),
typeof(ProductUnitReturnFact),
typeof(ShipmentFact),
typeof(EventFact),
typeof(ComponentUnitFact),
typeof(SourceDetails)
};
if(!value.All(rootFact => allowedTypes.Contains(rootFact.GetType())))
throw new Exception ("DataWarehouseFacts ne peut être défini qu'avec des faits principaux");
ProductUnitFacts = value.OfType().ToList();
FailureFacts = value.OfType().ToList();
DefectFacts = value.OfType().ToList();
ProcessRunFacts = value.OfType().ToList();
CustomerFacts = value.OfType().ToList();
ProductUnitReturnFacts = value.OfType().ToList();
ShipmentFacts = value.OfType().ToList();
EventFacts = value.OfType().ToList();
ComponentUnitFacts = value.OfType().ToList();
SourceDetails = value.OfType().Single();
}
}
Quel serait le meilleur moyen de contourner cette validation ?
Merci.