2011-05-16 6 views
7

que tienen una clase como esta:¿Cómo usar Moles para un constructor?

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; 
    } 

Quiero ModifyPrice no hacer nada para un valor específico, pero también quiero llamar al constructor que establece el precio a 10. He intentado algo como esto:

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; 

Pero incluso si falsa es así inicializado con el bien-constructor, no puedo asignarlo a @este. También intento algo como

MProduct.Constructor = (@this) => { var mole = new MProduct(@this)... }; 

Pero esta vez no puedo llamar a mi constructor. ¿Cómo se supone que debo hacer?

Respuesta

5

No necesita burlarse del constructor, el constructor sin parámetros de la clase Product ya hace lo que quiere.

Agregue algunos resultados de depuración a 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 sólo el ModifyPrice método.

[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); 
} 

ver la salida de depuración para confirmar que todo funciona como se esperaba:

 
    Initializing price: 10 
    Skipped setting price. 
    New price: 210 

Por cierto, que no es necesario utilizar el talón de aquí,

var fake = new SProduct { CallBase = true }; 

creación de una instancia de Product será suficiente.

var fake = new Product(); 

Actualización: Burlándose de un único método que puede lograrse con la clase AllInstances como esto

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); 
+0

Hum, que no entendía mi pregunta. Tu ejemplo tiene buenos puntos. Sin embargo, necesito un simulacro de Producto que llame a los métodos originales, a excepción de ModifyPrice. Por eso necesito un CallBase = true (para un Stub) o un InstanceBehavior = MoleBehaviors.FallThrough (para un Mole). Además, y ese es el punto más importante, quiero saturar todas las instancias futuras de Producto con mi simulacro. Es por eso que necesito burlarme del constructor. – Jeco

+1

@Jeco Puede que te haya malinterpretado de nuevo, pero parece que puedes lograr lo que quieres con la clase 'AllInstances'. – Gebb

+0

Sigue siendo una buena respuesta. Me disculpo por mis ejemplos incompletos, siempre tengo otros puntos en mente. Estaba comparando varios frameworks burlones con Moles, así que traté de estudiar todas las posibilidades. Pandear todas las instancias futuras de un objeto con un Moles parece ser una buena idea (traté de verificar todas las llamadas a los métodos y representó a muchas 'AllInstances' en comparación con una 'NonImplementedException'). Estaba tratando desesperadamente de usar el constructor para hacer '@ this = aMole' ... Pero como se dice en el manual de Moles, es realmente un marco de aislamiento y no un marco simulado. Gracias por las respuestas – Jeco

0
MProduct.Behavior = MoleBehaviors.Fallthrough; 
+0

Muy escueta respuesta ... –

Cuestiones relacionadas