52 votes

Mock propriété statique avec moq

Je suis assez nouveau à l'utilisation de moq. Je suis dans la création d'une unité de cas de test à l' HttpModule et tout fonctionne bien jusqu'à ce que je frappe un static biens de la façon suivante

this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty;

Je ne sais pas comment créer des objets fantaisie pour static de la classe et de la propriété comme HttpRuntime.AppDomainAppVirtualPath. L' context, request et response ont été la risée bien avec un exemple de code que j'obtiens de moq. Je vais apprécier si quelqu'un peut m'aider sur ce point.

Merci à l'avance.

73voto

Elisha Points 11999

Moq ne pouvez pas truquer les membres statiques.

Comme une solution, vous pouvez créer une classe wrapper (Adaptateur), qui détient la propriété statique de la faux et de ses membres.
Par exemple:

public class HttpRuntimeWrapper
{
    public virtual string AppDomainAppVirtualPath 
    { 
        get
        { 
            return HttpRuntime.AppDomainAppVirtualPath; 
        }
    }
}

Dans le code de production, vous pouvez accéder à cette classe au lieu de HttpRuntime et de faux cette propriété:

[Test]
public void AppDomainAppVirtualPathTest()
{
    var mock = new Moq.Mock<HttpRuntimeWrapper>();
    mock.Setup(fake => fake.AppDomainAppVirtualPath).Returns("FakedPath");

    Assert.AreEqual("FakedPath", mock.Object.AppDomainAppVirtualPath);
}

Une autre solution est de recourir à l'Isolement cadre que Typemock Isolateur) dans lequel vous pourrez faux statique des classes et des membres.
Par exemple:

Isolate.WhenCalled(() => HttpRuntime.AppDomainAppVirtualPath)
       .WillReturn("FakedPath");

Avertissement - je travaille à Typemock

17voto

Finglas Points 8645

Vous ne pouvez pas Moq méthodes statiques Moq.

Ce n'est pas une mauvaise chose en réalité, les méthodes statiques et les classes ont leur place, mais pour la logique ils font des tests unitaires difficile. Naturellement, vous allez courir en eux lors de l'utilisation d'autres bibliothèques. Pour contourner cela, vous aurez besoin de rédiger un adaptateur (wrapper) autour de la statique de code, et de fournir une interface. Par exemple:

// Your static class - hard to mock
class StaticClass
{
   public static int ReturnOne() 
   {
       return 1;
   }
}

// Interface that you'll use for a wrapper
interface IStatic
{
    int ReturnOne();
}

Remarque, j'ai omis la classe concrète qui utilise IStatic pour la production de code. Tous c'est une classe qui utilise IStatic et votre code de production qui en ferait usage de cette classe, plutôt que d' StaticClass - dessus.

Puis avec Moq:

var staticMock = new Mock<IStatic>();
staticMock.Setup(s => s.ReturnOne()).Returns(2);

3voto

Kirschstein Points 5229

Comme mentionné dans les réponses précédentes, vous ne pouvez pas utiliser MoQ sur des méthodes statiques. Si vous en avez le besoin, votre meilleure idée consiste à créer un wrapper autour de la classe statique.

Cependant, quelque chose que j'ai découvert récemment est le projet Moles . À partir de la page d'accueil; "Moles permet de remplacer n'importe quelle méthode .NET par un délégué. Moles supporte les méthodes statiques ou non virtuelles." Cela pourrait être utile pour votre situation actuelle.

2voto

Ian Points 13892

La meilleure solution que j'ai trouvé pour l'instant est de Telerik est JustMock - malheureusement, seule la version de payer pour permet se moquant de la statique.

Bien que l'idée de l'habillage statique est un bon un, vous ne pouvez pas toujours faire. Si vous voulez tester un code qui utilise certaines classes statiques déjà à l'époque, il n'est pas toujours possible de passer et d'utiliser un wrapper. Dans ce cas JustMock semble une solution raisonnable et je vais probablement l'utiliser sur certaines solutions dans le proche avenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X