Вам не нужно издеваться над конструктором, конструктор без параметров класса Product
уже делает то, что вы хотите.
Добавить отладочную информацию к 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);
}
}
Перемешивать только метод ModifyPrice
.
[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);
}
Посмотрите выходные данные отладки, чтобы подтвердить, что все работает как ожидалось:
Initializing price: 10
Skipped setting price.
New price: 210
Кстати, здесь вам не нужно использовать заглушку,
var fake = new SProduct { CallBase = true };
будет достаточно создать экземпляр Product
.
var fake = new Product();
Обновление:
Насмешка одного метода может быть достигнута с помощью класса AllInstances
, как этот
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);