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?

War es hilfreich?

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

generasacodicetagpre.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top