100 votes

Comment MOQ une propriété Indexée

Je suis tenter de se moquer d'un appel à une propriété indexée. I. e. Je voudrais moq suivantes:

object result = myDictionaryCollection["SomeKeyValue"];

et aussi le poseur de valeur

myDictionaryCollection["SomeKeyValue"] = myNewValue;

Je le fais parce que j'ai besoin pour se moquer de la fonctionnalité d'une classe de mon application utilise.

Personne ne sait comment faire cela avec MOQ? J'ai essayé de variations sur les points suivants:

Dictionary<string, object> MyContainer = new Dictionary<string, object>();
mock.ExpectGet<object>( p => p[It.IsAny<string>()]).Returns(MyContainer[(string s)]);

Mais cela ne veut pas compiler.

Est ce que je suis en train de réaliser possible avec MOQ, quelqu'un aurait-il des exemples de la façon dont je peux le faire?

118voto

Mike Scott Points 6062

Il n'est pas clair ce que vous essayez de faire. Vous ne vous montrez pas la déclaration de la maquette. Êtes-vous essayer de se moquer d'un dictionnaire?

MyContainer[(string s)] n'est pas valide en C#.

Cette compile:

        var mock = new Mock<IDictionary>();
        mock.SetupGet( p => p[It.IsAny<string>()]).Returns("foo");

20voto

wasker Points 837

Ash, si vous voulez avoir de la Session HTTP moquer, alors ce bout de code fait le travail:

/// <summary>
/// HTTP session mockup.
/// </summary>
internal sealed class HttpSessionMock : HttpSessionStateBase
{
    private readonly Dictionary<string, object> objects = new Dictionary<string, object>();

    public override object this[string name]
    {
        get { return (objects.ContainsKey(name)) ? objects[name] : null; }
        set { objects[name] = value; }
    }
}

/// <summary>
/// Base class for all controller tests.
/// </summary>
public class ControllerTestSuiteBase : TestSuiteBase
{
    private readonly HttpSessionMock sessionMock = new HttpSessionMock();

    protected readonly Mock<HttpContextBase> Context = new Mock<HttpContextBase>();
    protected readonly Mock<HttpSessionStateBase> Session = new Mock<HttpSessionStateBase>();

    public ControllerTestSuiteBase()
        : base()
    {
        Context.Expect(ctx => ctx.Session).Returns(sessionMock);
    }
}

3voto

CVertex Points 7334

J'ai posé cette question sur le Moq des forums de discussion.

Je n'ai pas essayé, mais Dan (Moq auteur) dit qu'il fonctionne.

0voto

Ne serait-il pas plus facile de simplement utiliser un objet stub? Définir les valeurs nécessaires et vérifier les indices dont vous avez besoin.

0voto

seanlinmt Points 3032

Je peux définir et obtenir la valeur. Eh bien, il ya quelques problèmes de retourner la valeur. Jetez un oeil ici

http://stackoverflow.com/questions/1642631/moq-mocking-and-tracking-session-values

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