Wie verwende ich Maulwürfe als Konstrukteur?
-
14-11-2019 - |
Frage
Ich habe eine Klasse wie diese:
public class Product : IProduct
{
static private string _defaultName = "default";
private string _name;
private float _price;
/// Constructor
public Product()
{
_price = 10.0F;
}
public void ModifyPrice(float modifier)
{
_price = _price * modifier;
}
Ich will Preis ändern Ich möchte für einen bestimmten Wert nichts tun, möchte aber auch den Konstruktor aufrufen, der den Preis auf 10 festgelegt hat.Ich habe so etwas versucht:
var fake = new SProduct() { CallBase = true };
var mole = new MProduct(fake)
{
ModifyPriceSingle = (actual) =>
{
if (actual != 20.0f)
{
MolesContext.ExecuteWithoutMoles(() => fake.ModifyPrice(actual));
}
}
};
MProduct.Constructor = (@this) => (@this) = fake;
Aber selbst wenn gefälscht mit dem guten Konstruktor gut initialisiert ist, kann ich es @this nicht zuweisen.Ich versuche auch so etwas wie
MProduct.Constructor = (@this) => { var mole = new MProduct(@this)... };
Aber dieses Mal kann ich meinen Konstruktor nicht aufrufen.Wie soll ich vorgehen?
Lösung
Sie müssen den Konstruktor, den parameterlosen Konstruktor des, nicht verspotten Product
Die Klasse macht bereits, was Sie wollen.
Fügen Sie einige Debugging-Ausgaben hinzu Product
.
public class Product
{
private float _price;
public Product()
{
_price = 10.0F;
Debug.WriteLine("Initializing price: {0}", _price);
}
public void ModifyPrice(float modifier)
{
_price = _price*modifier;
Debug.WriteLine("New price: {0}", _price);
}
}
Verspotte nur das ModifyPrice
Methode.
[TestMethod]
[HostType("Moles")]
public void Test1()
{
// Call a constructor that sets the price to 10.
var fake = new SProduct { CallBase = true };
var mole = new MProduct(fake)
{
ModifyPriceSingle = actual =>
{
if (actual != 20.0f)
{
MolesContext.ExecuteWithoutMoles(() => fake.ModifyPrice(actual));
}
else
{
Debug.WriteLine("Skipped setting price.");
}
}
};
fake.ModifyPrice(20f);
fake.ModifyPrice(21f);
}
Sehen Sie sich die Debug-Ausgabe an, um zu bestätigen, dass alles wie erwartet funktioniert:
Initializing price: 10 Skipped setting price. New price: 210
Übrigens müssen Sie den Stub hier nicht verwenden,
var fake = new SProduct { CallBase = true };
Erstellen einer Instanz von Product
wird genügen.
var fake = new Product();
Aktualisieren:Das Verspotten einer einzelnen Methode kann mit erreicht werden AllInstances
Klasse wie diese
MProduct.Behavior = MoleBehaviors.Fallthrough;
MProduct.AllInstances.ModifyPriceSingle = (p, actual) =>
{
if (actual != 20.0f)
{
MolesContext.ExecuteWithoutMoles(() => p.ModifyPrice(actual));
}
else
{
Debug.WriteLine("Skipped setting price.");
}
};
// Call the constructor that sets the price to 10.
Product p1 = new Product();
// Skip setting the price.
p1.ModifyPrice(20f);
// Set the price.
p1.ModifyPrice(21f);
Andere Tipps