Comment utiliser les taupes pour un constructeur?
-
14-11-2019 - |
Question
J'ai un cours comme ceci:
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;
}
je veux Modifier Pour ne rien faire pour une valeur spécifique, mais je veux aussi appeler le constructeur qui a fixé le prix sur 10. J'ai essayé quelque chose comme ceci:
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;
Mais même si faux est bien initialisé avec le bon constructeur, je ne peux pas l'affecter à @this. J'essaye aussi quelque chose comme
MProduct.Constructor = (@this) => { var mole = new MProduct(@this)... };
Mais cette fois, je ne peux pas appeler mon constructeur. Comment suis-je censé faire?
La solution
Vous n'avez pas besoin de se moquer du constructeur, le constructeur sans paramètre du Product
La classe fait déjà ce que vous voulez.
Ajouter une sortie de débogage à 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);
}
}
MOCK SEULEMENT le ModifyPrice
méthode.
[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);
}
Voir la sortie de débogage pour confirmer que tout fonctionne comme prévu:
Initializing price: 10 Skipped setting price. New price: 210
Au fait, vous n'avez pas besoin d'utiliser le talon ici,
var fake = new SProduct { CallBase = true };
Créer une instance de Product
suffira.
var fake = new Product();
Mise à jour:Se moquer d'une seule méthode peut être obtenue avec le AllInstances
classe comme celle-ci
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);
Autres conseils
MProduct.Behavior = MoleBehaviors.Fallthrough;