J'ai quelques classes de base avec des méthodes de clonage:Unité Test d'une méthode clone avec Moq en C#
public class SimpleClass
{
public int ValueA { get; set; }
public string ValueB { get; set; }
public ulong ValueC { get; set; }
public SimpleClass TypedClone()
{
var item = new SimpleClass
{
ValueA = this.ValueA,
ValueB = this.ValueB,
ValueC = this.ValueC
};
return item;
}
}
Je veux un test unitaire qui me dira si j'ajouter Valued, mais oublier d'ajouter au clone méthode. Ma première tentative consistait à utiliser Moq et sa méthode VerifyGet pour m'assurer que chaque propriété était accessible.
public void GenericCloneTest()
{
var mock = new Mock<SimpleClass>();
var c = mock.Object.GenericClone();
var properties = typeof(SimpleClass).GetProperties();
foreach (var property in properties)
{
var expression = Expression.Property(
Expression.Parameter(typeof(SimpleClass), "c"),
property);
var type = Expression.GetFuncType(typeof (SimpleClass),
property.PropertyType);
var actionExpression = Expression.Lambda(type, expression,
Expression.Parameter(typeof(SimpleClass), "c"));
mock.VerifyGet<object>
((Expression<Func<SimpleClass,object>>)actionExpression);
}
}
Cela ne fonctionne pas parce que la méthode VerifyGet a besoin de connaître le type de retour de l'accesseur de la propriété, et je ne peux pas comprendre quelque façon que pour l'insérer à l'exécution (vous remarquerez ma tentative boiteux utilisez "objet" qui s'est écrasé et brûlé).
Je ne suis même pas sûr que l'utilisation de Moq soit une bonne idée, c'était juste mon premier. MISE À JOUR: Sans méthode générique rapide et facile pour tester une méthode de clonage, je me suis contenté d'écrire des tests spécifiques au type pour chaque classe. Cela me laisse toujours le problème de savoir quand les propriétés ont été ajoutées. Je me suis contenté d'ajouter ceci à mes tests unitaires de clones:
var signature = typeof (Connection)
.GetProperties()
.Select(p => p.Name)
.Aggregate(
new StringBuilder(),
(builder, name) =>
builder.Append(name)).ToString();
Assert.AreEqual(
"DataSessionStateDataTechnologyBytesReceivedBytesSentDuration",
signature);
Si j'ajoute une propriété, le test échouera. Cela dépend toujours que je sois assez responsable pour réparer le reste du test lorsque la correspondance de signature échoue.
Merci Paul! J'ai toujours pensé qu'il devait y avoir quelque chose de intégré à .NET comme ça, mais je ne l'avais pas encore trouvé. Cela sera utile partout où je veux faire une copie superficielle rapide. – MichaC