web-dev-qa-db-fra.com

Comment se moquer d'une fonction Appeler sur un objet concret avec MOQ?

Comment puis-je faire cela dans le MOQ?

Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')

Il semble que je ne puisse trouver que de se moquer d'un objet créé via le cadre. Je veux me moquer d'une seule méthode/propriété sur un objet concret que j'ai créé.

Dans Typemock, je ferais simplement Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').

Des idées?

32
dferraro

Seuls l'isolateur de Typemock (et peut-être des moles) peut effectuer ces cascades. Les bibliothèques de simulation dynamique normale peuvent que des membres virtuels et abstraits simulés .

13
Mark Seemann

Vous devez utiliser MOQ pour créer votre objet simulé et définir la propriété CallBase en true pour utiliser le comportement de l'objet.

À partir de la documentation MOQ: CallBase est définie comme "invoquer la mise en œuvre de la classe de base si aucune attente ne remplace le membre. Ceci est appelé "partiel simulé". Cela permet de se moquer de certaines parties d'une classe sans avoir à se moquer de tout.

Exemple de code:

    [Test]
    public void FailintgTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    [Test]
    public void OKTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        mock.CallBase = true;
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    public class MyClass
    {
        public virtual string Name { get { return "MyClass"; } }

        public virtual int Number { get { return 2; } }
    }
53
Ariel Popovsky

Les taupes peuvent également remplacer des méthodes privées tant que les types de signature sont visibles. Donc, dans ce cas, cela ressemblerait à ceci:

MFoo bar = new MFoo { // instantiate the mole of 'Foo'
    PrivateGetterGet = () => "whatever value" // replace PrivateGetter {get;}
};
Foo realBar = bar; // retrive the runtime instance
...

Si vous recherchez plus d'informations sur Moles, commencez par les tutoriels à http://research.microsoft.com/en-us/projects/pex/documentation.aspx .

3
Peli