Ich habe einige grundlegende Klassen mit Klonierungsverfahren:Einheit einen Klon-Methode mit Moq in C# Testen
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;
}
}
ich einen Komponententest wollen, die mir sagen, ob ich Valued hinzufügen, aber vergessen, es zu dem Klon hinzufügen Methode. Mein erster Versuch war, Moq und seine VerifyGet-Methode zu verwenden, um sicherzustellen, dass auf jede Eigenschaft zugegriffen wurde.
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);
}
}
Das funktioniert nicht, weil die VerifyGet Methode des Rückgabetyp des Eigenschaftenaccessor wissen muss, und ich kann jede mögliche Weise nicht herausfinden, es zur Laufzeit einfügen (Sie werden meinen lahmen Versuch feststellen zu Verwenden Sie "Objekt", das abgestürzt und gebrannt hat).
Ich bin nicht einmal sicher, ob Moq eine gute Idee ist, es war nur meine erste.
UPDATE: Ohne eine schnelle und einfache generische Möglichkeit, eine Klonierungsmethode zu testen, entschied ich mich, typspezifische Tests für jede Klasse zu schreiben. Dies wirft immer noch das Problem auf, zu wissen, wann Eigenschaften hinzugefügt wurden. Ich ließ mich diese zu meinen Klon Unit-Tests auf anhängt:
var signature = typeof (Connection)
.GetProperties()
.Select(p => p.Name)
.Aggregate(
new StringBuilder(),
(builder, name) =>
builder.Append(name)).ToString();
Assert.AreEqual(
"DataSessionStateDataTechnologyBytesReceivedBytesSentDuration",
signature);
Wenn ich eine Eigenschaft der Test fehl hinzufügen. Es hängt immer noch davon ab, ob ich genug Verantwortung habe, um den Rest des Tests zu reparieren, wenn die Signaturübereinstimmung fehlschlägt.
Danke Paul! Ich dachte immer, dass etwas in .NET eingebaut sein müsste, aber es noch nicht gefunden hatte. Dies wird überall dort nützlich sein, wo ich eine schnelle seichte Kopie machen möchte. – MichaC