कैसे एक अनुक्रमित संपत्ति MOQ के लिए


82

मैं एक अनुक्रमित संपत्ति पर कॉल करने का प्रयास कर रहा हूं। Ie मैं निम्नलिखित moq करना चाहते हैं:

object result = myDictionaryCollection["SomeKeyValue"];

और सेटर मूल्य भी

myDictionaryCollection["SomeKeyValue"] = myNewValue;

मैं ऐसा इसलिए कर रहा हूं क्योंकि मुझे मेरे ऐप द्वारा उपयोग की जाने वाली कक्षा की कार्यक्षमता का मजाक उड़ाना होगा।

क्या किसी को पता है कि यह moq के साथ कैसे करना है? मैंने निम्नलिखित पर बदलाव की कोशिश की है:

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

लेकिन यह संकलन नहीं है।

क्या मैं MOQ के साथ संभव हासिल करने की कोशिश कर रहा हूं, क्या किसी के पास कोई उदाहरण है कि मैं यह कैसे कर सकता हूं?


यह सिर्फ एक स्टब वस्तु का उपयोग करने के लिए आसान नहीं होगा? आवश्यक मान सेट करें और आपको आवश्यक अनुक्रमित की जांच करें।
सोरेन स्पेलिंग लंड

जवाबों:


96

यह स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं क्योंकि आप नकली की घोषणा नहीं दिखाते हैं। क्या आप एक शब्दकोश का मजाक उड़ाने की कोशिश कर रहे हैं?

MyContainer[(string s)] मान्य नहीं है #।

यह संकलन:

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

1
यह भी काम करता है। को छोड़कर नए वाक्यविन्यास का उपयोग करता SetupSetहै ExpectGet। साथ ही बसने वालों के लिए भी काम करता है।
tmont

1
IDEDIA

20

ऐश, अगर आप HTTP सेशन मॉक करना चाहते हैं, तो यह कोड काम करता है:

/// <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);
    }
}

एक अच्छा - यह वही था जो मुझे +1 की जरूरत थी
इयान ऑक्सले

1
इस कोड का कौन सा भाग परीक्षण के तहत मॉक सत्र का उपयोग करता है? है TestSuiteBaseकिसी लाइब्रेरी या अपने स्वयं के वर्ग?
19

1
यह नकली नहीं है, यह नकली है। बस केह रहा हू।
क्रिस पीकॉक

17

जैसा कि आपने सही ढंग से देखा है, अलग-अलग तरीके हैं SetupGetऔर SetupSetक्रमशः गेटर्स और सेटरों को इनिशियलाइज़ करना है। यद्यपि SetupGetइसका उपयोग गुणों के लिए किया जाना है, न कि अनुक्रमणकों के लिए, और आपको इसके पास दिए गए कुंजी को संभालने की अनुमति नहीं देगा। सटीक होने के लिए, वैसे भी इंडेक्सर्स SetupGetकॉल करेंगे Setup:

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

अपने प्रश्न का उत्तर देने के लिए, यहाँ एक Dictionaryस्टोर सैंपल है जो स्टोर वैल्यूज़ को अंतर्निहित करता है:

var dictionary = new Dictionary<string, object>();

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

जैसा कि आप देख सकते हैं, आपको इंडेक्स सेटर सेट करने के लिए कुंजी को स्पष्ट रूप से निर्दिष्ट करना होगा। विवरण एक और SO प्रश्न में वर्णित हैं: एक अनुक्रमित संपत्ति Moq और वापसी / कॉलबैक में सूचकांक मूल्य का उपयोग करें


1
यह वही है जिसे मैं देख रहा था!! अन्य उदाहरणों में से किसी ने भी काम नहीं किया
फियोना - myaccessible.website

8

यह मुश्किल नहीं है, लेकिन इसे खोजने में थोड़ा सा समय लगा :)

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

-4

ऐसा प्रतीत होता है कि मैं moq के साथ जो करने का प्रयास कर रहा था वह संभव नहीं है।

अनिवार्य रूप से मैं एक HTTPSession प्रकार के MOQ के लिए प्रयास कर रहा था, जहां आइटम की कुंजी इंडेक्स में सेट की जा रही है केवल रनटाइम पर निर्धारित किया जा सकता है। पहले से निर्धारित मूल्य को वापस करने के लिए आवश्यक अनुक्रमित संपत्ति तक पहुंच। यह पूर्णांक आधारित अनुक्रमित के लिए काम करता है, लेकिन स्ट्रिंग आधारित अनुक्रमित काम नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.