Come MOQ una proprietà indicizzata

Sto tentando di prendere in giro una chiamata a una proprietà indicizzata. Vale a dire vorrei attenuare quanto segue:

object result = myDictionaryCollection["SomeKeyValue"]; 

e anche il valore di setter

 myDictionaryCollection["SomeKeyValue"] = myNewValue; 

Lo sto facendo perché ho bisogno di prendere in giro la funzionalità di una class utilizzata dalla mia app.

Qualcuno sa come farlo con MOQ? Ho provato delle variazioni su quanto segue:

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

Ma questo non si compila.

È ciò che sto cercando di ottenere con MOQ, qualcuno ha qualche esempio di come posso farlo?

    Non è chiaro cosa stai cercando di fare perché non mostri la dichiarazione della simulazione. Stai cercando di deridere un dizionario?

    MyContainer[(string s)] non è valido C #.

    Questo compila:

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

    Ash, se vuoi fare una finta sessione HTTP, allora questo pezzo di codice fa il lavoro:

     ///  /// HTTP session mockup. ///  internal sealed class HttpSessionMock : HttpSessionStateBase { private readonly Dictionary objects = new Dictionary(); public override object this[string name] { get { return (objects.ContainsKey(name)) ? objects[name] : null; } set { objects[name] = value; } } } ///  /// Base class for all controller tests. ///  public class ControllerTestSuiteBase : TestSuiteBase { private readonly HttpSessionMock sessionMock = new HttpSessionMock(); protected readonly Mock Context = new Mock(); protected readonly Mock Session = new Mock(); public ControllerTestSuiteBase() : base() { Context.Expect(ctx => ctx.Session).Returns(sessionMock); } } 

    Come hai individuato correttamente, ci sono diversi metodi SetupGet e SetupSet per inizializzare rispettivamente getter e setter. Sebbene SetupGet sia destinato a essere utilizzato per le proprietà, non agli indicizzatori e non consentirà la gestione della chiave passata. Per essere precisi, per gli indicizzatori SetupGet chiamerà comunque Setup :

     internal static MethodCallReturn SetupGet(Mock mock, Expression> expression, Condition condition) where T : class { return PexProtector.Invoke>((Func>) (() => { if (ExpressionExtensions.IsPropertyIndexer((LambdaExpression) expression)) return Mock.Setup(mock, expression, condition); ... } ... } 

    Per rispondere alla tua domanda, ecco un esempio di codice che utilizza il Dictionary sottostante per memorizzare i valori:

     var dictionary = new Dictionary(); var applicationSettingsBaseMock = new Mock(); applicationSettingsBaseMock .Setup(sb => sb[It.IsAny()]) .Returns((string key) => dictionary[key]); applicationSettingsBaseMock .SetupSet(sb => sb["Expected Key"] = It.IsAny()) .Callback((string key, object value) => dictionary[key] = value); 

    Come puoi vedere, devi specificare esplicitamente la chiave per impostare il setter dell’indicizzatore. I dettagli sono descritti in un’altra domanda SO: Moq una proprietà indicizzata e utilizzare il valore indice nel return / callback

    Non è così difficile ma ci è voluto un po ‘per trovarlo 🙂

     var request = new Moq.Mock(); request.SetupGet(r => r["foo"]).Returns("bar"); 

    Sembra che ciò che stavo tentando di fare con MOQ non è ansible.

    Essenzialmente stavo tentando di MOQ un object di tipo HTTPSession, in cui la chiave dell’elemento impostato sull’indice poteva essere determinata solo in fase di runtime. Accesso alla proprietà indicizzata necessaria per restituire il valore precedentemente impostato. Funziona per indici basati su interi, ma gli indici basati su stringhe non funzionano.