दिलचस्प पोस्ट
सरणी सूचकांक के बजाय इटरेटर का उपयोग क्यों करें? "यह" चर आसानी से सेट करें? JavaScript विरासत और निर्माता संपत्ति IIS 7, विंडोज 7 पर एएसपी.नेट 4.0 को एप्लीकेशन पूल में कैसे जोड़ें I #ifndef और #define सी + + हैडर फाइल में क्यों उपयोग किया जाता है? चरण को कम करने के बाद आउटपुट फाइल मर्ज करें स्ट्रिंग को दूसरे में जावा में बदलें कैसे आप अजगर में एक चर नाम मुद्रित कर सकते हैं? ActiveRecord / Rails के साथ क्वेरी में नहीं व्यक्त करने के लिए कैसे? अजगर में बैकस्लैश-एस्केप स्ट्रिंग से मैं कैसे बच निकलो? Class.getResource () और ClassLoader.getResource () के बीच अंतर क्या है? Android.os.SystemProperties कहां है? इनपुट फ़ील्ड से विशेषता को पढ़ते समय HTML- एन्कोडिंग खो गया टेक्स्ट बॉक्स में एन्टर की पर जावास्क्रिप्ट के साथ एक बटन ट्रिगर करें XMLHttpRequest फ़ाइल लोड नहीं कर सकता। क्रॉस मूल अनुरोध केवल HTTP के लिए समर्थित हैं

Moq में आउट / रेफरे पैरामीटर निर्दिष्ट करना

क्या Moq (3.0) का उपयोग करके एक आउट / रेफ़ पैरामीटर असाइन करना संभव है?

मैंने Callback() का उपयोग कर देखा है, लेकिन Action<> रेफ़ पैरामीटर का समर्थन नहीं करती है क्योंकि यह जेनेरिक पर आधारित है मैं ref पैरामीटर के इनपुट पर एक बाधा ( It.Is ) को भी पसंद करना चाहूंगा, हालांकि मैं कॉलबैक में ऐसा कर सकता हूं।

मुझे पता है कि राइनो मैक्स इस कार्यक्षमता का समर्थन करता है, लेकिन जिस परियोजना पर मैं काम कर रहा हूं वह पहले से ही Moq का उपयोग कर रहा है

वेब के समाधान से एकत्रित समाधान "Moq में आउट / रेफरे पैरामीटर निर्दिष्ट करना"

Avner Kashtan अपने ब्लॉग में एक एक्सटेंशन विधि प्रदान करता है जो एक कॉलबैक से बाहर पैरामीटर सेट करने की अनुमति देता है: Moq, कॉलबैक और आउट पैरामीटर: एक विशेष रूप से मुश्किल किनारे का मामला

समाधान दोनों सुंदर और हैक है सुरुचिपूर्ण में यह एक धाराप्रवाह सिंटैक्स प्रदान करता है जो अन्य मुकबैक कॉलबैक के साथ-साथ घर में महसूस करता है। और हैकी क्योंकि यह कुछ आंतरिक Moq API को प्रतिबिंब के माध्यम से कॉल करने पर निर्भर करता है।

उपर्युक्त लिंक पर उपलब्ध एक्सटेंशन विधि मेरे लिए संकलित नहीं हुई है, इसलिए मैंने नीचे एक संपादित संस्करण दिया है। आपके पास प्रत्येक इनपुट इनपुट पैरामीटर के लिए एक हस्ताक्षर बनाने की आवश्यकता होगी; मैंने 0 और 1 प्रदान किया है, लेकिन इसे आगे बढ़ाकर सरल होना चाहिए:

 public static class MoqExtensions { public delegate void OutAction<TOut>(out TOut outVal); public delegate void OutAction<in T1,TOut>(T1 arg1, out TOut outVal); public static IReturnsThrows<TMock, TReturn> OutCallback<TMock, TReturn, TOut>(this ICallback<TMock, TReturn> mock, OutAction<TOut> action) where TMock : class { return OutCallbackInternal(mock, action); } public static IReturnsThrows<TMock, TReturn> OutCallback<TMock, TReturn, T1, TOut>(this ICallback<TMock, TReturn> mock, OutAction<T1, TOut> action) where TMock : class { return OutCallbackInternal(mock, action); } private static IReturnsThrows<TMock, TReturn> OutCallbackInternal<TMock, TReturn>(ICallback<TMock, TReturn> mock, object action) where TMock : class { mock.GetType() .Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackWithArguments", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, mock, new[] { action }); return mock as IReturnsThrows<TMock, TReturn>; } } 

उपरोक्त एक्सटेंशन विधि के साथ, आप बाहरी मापदंडों जैसे अंतरफलक का परीक्षण कर सकते हैं जैसे:

 public interface IParser { bool TryParse(string token, out int value); } 

.. निम्न Moq सेटअप के साथ:

  [TestMethod] public void ParserTest() { Mock<IParser> parserMock = new Mock<IParser>(); int outVal; parserMock .Setup(p => p.TryParse("6", out outVal)) .OutCallback((string t, out int v) => v = 6) .Returns(true); int actualValue; bool ret = parserMock.Object.TryParse("6", out actualValue); Assert.IsTrue(ret); Assert.AreEqual(6, actualValue); } 

संपादित करें : शून्य-वापसी विधियों का समर्थन करने के लिए, आपको बस नए ओवरलोड तरीकों को जोड़ने की आवश्यकता है:

 public static ICallbackResult OutCallback<TOut>(this ICallback mock, OutAction<TOut> action) { return OutCallbackInternal(mock, action); } public static ICallbackResult OutCallback<T1, TOut>(this ICallback mock, OutAction<T1, TOut> action) { return OutCallbackInternal(mock, action); } private static ICallbackResult OutCallbackInternal(ICallback mock, object action) { mock.GetType().Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackWithArguments", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, mock, new[] { action }); return (ICallbackResult)mock; } 

यह इंटरफ़ेस का परीक्षण करने की अनुमति देता है जैसे कि:

 public interface IValidationRule { void Validate(string input, out string message); } [TestMethod] public void ValidatorTest() { Mock<IValidationRule> validatorMock = new Mock<IValidationRule>(); string outMessage; validatorMock .Setup(v => v.Validate("input", out outMessage)) .OutCallback((string i, out string m) => m = "success"); string actualMessage; validatorMock.Object.Validate("input", out actualMessage); Assert.AreEqual("success", actualMessage); } 

'आउट' के लिए, निम्नलिखित मेरे लिए काम करने लगता है

 public interface IService { void DoSomething(out string a); } [TestMethod] public void Test() { var service = new Mock<IService>(); var expectedValue = "value"; service.Setup(s => s.DoSomething(out expectedValue)); string actualValue; service.Object.DoSomething(out actualValue); Assert.AreEqual(actualValue, expectedValue); } 

मुझे लग रहा है कि जब आप सेटअप कॉल करते हैं और इसे याद करते हैं, तो Moq 'अपेक्षित मूल्य' के मूल्य पर दिखता है।

'रेफरी' के लिए, मैं भी एक जवाब की तलाश कर रहा हूं

मुझे निम्न क्विकस्टार्ट गाइड उपयोगी पाया: https://github.com/Moq/moq4/wiki/Quickstart

यह Moq साइट से दस्तावेज़ीकरण है:

 // out arguments var outString = "ack"; // TryParse will return true, and the out argument will return "ack", lazy evaluated mock.Setup(foo => foo.TryParse("ping", out outString)).Returns(true); // ref arguments var instance = new Bar(); // Only matches if the ref argument to the invocation is the same instance mock.Setup(foo => foo.Submit(ref instance)).Returns(true); 

ऐसा लगता है कि यह बॉक्स से बाहर संभव नहीं है। ऐसा लगता है कि किसी ने एक समाधान का प्रयास किया

इस मंच के पोस्ट http://code.google.com/p/moq/issues/detail?id=176 देखें

यह सवाल Moq के साथ संदर्भ पैरामीटर का मान सत्यापित करें

यह एक समाधान हो सकता है

 [Test] public void TestForOutParameterInMoq() { //Arrange _mockParameterManager= new Mock<IParameterManager>(); Mock<IParameter > mockParameter= new Mock<IParameter >(); //Parameter affectation should be useless but is not. It's really used by Moq IParameter parameter= mockParameter.Object; //Mock method used in UpperParameterManager _mockParameterManager.Setup(x => x.OutMethod(out parameter)); //Act with the real instance _UpperParameterManager.UpperOutMethod(out parameter); //Assert that method used on the out parameter of inner out method are really called mockParameter.Verify(x => x.FunctionCalledInOutMethodAfterInnerOutMethod(),Times.Once()); } 

रेफ़ पैरामीटर सेट करने के साथ एक मान वापस करने के लिए, यहां कोड का एक टुकड़ा है:

 public static class MoqExtensions { public static IReturnsResult<TMock> DelegateReturns<TMock, TReturn, T>(this IReturnsThrows<TMock, TReturn> mock, T func) where T : class where TMock : class { mock.GetType().Assembly.GetType("Moq.MethodCallReturn`2").MakeGenericType(typeof(TMock), typeof(TReturn)) .InvokeMember("SetReturnDelegate", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, mock, new[] { func }); return (IReturnsResult<TMock>)mock; } } 

उसके बाद अपने स्वयं के प्रतिनिधि को घोषित विधि के हस्ताक्षर से मेल करें और अपना स्वयं का तरीका लागू करें।

 public delegate int MyMethodDelegate(int x, ref int y); [TestMethod] public void TestSomething() { //Arrange var mock = new Mock<ISomeInterface>(); var y = 0; mock.Setup(m => m.MyMethod(It.IsAny<int>(), ref y)) .DelegateReturns((MyMethodDelegate)((int x, ref int y)=> { y = 1; return 2; })); } 

मैं इस दोपहर के लिए एक घंटे के लिए संघर्ष किया और कहीं भी एक जवाब नहीं मिल सकता है अपने साथ चारों ओर खेलने के बाद मैं एक समाधान के साथ आया था जो मेरे लिए काम करता था

 string firstOutParam = "first out parameter string"; string secondOutParam = 100; mock.SetupAllProperties(); mock.Setup(m=>m.Method(out firstOutParam, out secondOutParam)).Returns(value); 

यहां की कुंजी mock.SetupAllProperties(); है mock.SetupAllProperties(); जो आपके लिए सभी गुणों को छूटेगा। यह हर टेस्ट केस परिदृश्य में काम नहीं कर सकता है, लेकिन यदि आप सभी की देखभाल करते return value तो YourMethod का return value हो YourMethod तो यह ठीक काम करेगा।