NSubstitute शिकायत कर रहा है कि मेरे तर्क अस्पष्ट हैं, हालाँकि जहाँ तक मुझे पता है वे पूरी तरह से विशिष्ट हैं। मैं और विवरण जोड़ूंगा लेकिन मैंने इसे पहले ही इस छोटे से उदाहरण में उबाला है। (संपादित करें: अब और भी छोटा, हटा दिया गया पैरामीटर, लेकिन तर्क के लिए परिभाषा नहीं।)

मेरा अंतिम लक्ष्य परीक्षणों के लिए एक सहायक विधि होने के लिए 'इनलाइन विधि' के लिए था, जिसमें परिणाम का इनपुट था, और अपेक्षित ITextObjC [] जो त्रुटियों की एक सरणी का प्रतिनिधित्व करता है।

न्यूनतम, पूर्ण, सत्यापन योग्य उदाहरण को देखते हुए:

    public interface test
    {
        bool testMethod(
            bool boolA,
            bool boolB);
    }

    public interface ITestObjC { }

    public class TestObjC : ITestObjC { }

    [Test]
    public void SillyTest2()
    {
        var fakeTest = Substitute.For<test>();

        fakeTest.testMethod(  false, false);

        ITestObjC[] recOutArr = Arg.Is<ITestObjC[]>(x => x == null);

        fakeTest.Received(1).testMethod(
            Arg.Is<bool>(false),
            Arg.Is<bool>(false));
    }

का परिणाम:

NSubstitute.Exceptions.AmbiguousArgumentsException : Cannot determine argument specifications to use.
Please use specifications for all arguments of the same type.
   at NSubstitute.Core.Arguments.NonParamsArgumentSpecificationFactory.Create(Object argument, IParameterInfo parameterInfo, ISuppliedArgumentSpecifications suppliedArgumentSpecifications)
   at NSubstitute.Core.Arguments.ArgumentSpecificationFactory.Create(Object argument, IParameterInfo parameterInfo, ISuppliedArgumentSpecifications suppliedArgumentSpecifications)
   at NSubstitute.Core.Arguments.MixedArgumentSpecificationsFactory.<>c__DisplayClass3_0.<Create>b__0(Object argument, Int32 i)
   at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at NSubstitute.Core.Arguments.MixedArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos)
   at NSubstitute.Core.Arguments.ArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos, MatchArgs matchArgs)
   at NSubstitute.Core.CallSpecificationFactory.CreateFrom(ICall call, MatchArgs matchArgs)
   at NSubstitute.Routing.Handlers.CheckReceivedCallsHandler.Handle(ICall call)
   at NSubstitute.Routing.Route.<>c__DisplayClass8_0.<Handle>b__0(ICallHandler x)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at NSubstitute.Routing.Route.Handle(ICall call)
   at NSubstitute.Core.CallRouter.Route(ICall call)
   at NSubstitute.Proxies.CastleDynamicProxy.CastleForwardingInterceptor.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.Proxies.testProxy.testMethod(ITestObjA motionEnvelope, ITestObjB motionSeries, Boolean primaryLimits, Boolean testPitch, ITestObjC[]& exceedences)
   at HeliSAFE.DataStorage.Tests.SholMonitor.CommonSholMonitorTests.SillyTest2() in D:\Repositories\GitSAFE_Repos\helisafe.container\helisafe\HeliSAFE.DataStorage.Tests\SholMonitor\CommonSholMonitorTests.cs:line 375

इस लाइन पर:

fakeTest.Received(1).testMethod(

0
Ryan Leach 7 मई 2018, 09:19

2 जवाब

सबसे बढ़िया उत्तर

संक्षिप्त उत्तर है किसी Received के बाहर तर्क मिलानकर्ताओं का उपयोग न करें या Returns.

लंबा उत्तर यह है कि NSubstitute का सिंटैक्स प्राप्त करने के लिए यह कुछ संदिग्ध चीजें करता है। इस मामले में, हर बार जब आप Arg.Is या Arg.Any करते हैं तो यह तर्क मिलानकर्ता को एक स्थिर (थ्रेडलोकल) कतार में धकेल देता है। जब यह एक वास्तविक कॉल प्राप्त करता है तो यह इन तर्क मिलानकर्ताओं को यह पता लगाने के लिए पुनर्प्राप्त करता है कि कौन से कॉल मेल खाते हैं (Received के लिए) या स्टब को क्या कॉल करते हैं (Returns के लिए)।

इस मामले में तीन तर्क मिलानकर्ता कतारबद्ध हैं, लेकिन fakeTest .Received().testMethod(bool a, bool b) में केवल दो लगते हैं, इसलिए NSubstitute को यह सुनिश्चित नहीं है कि तीन तर्क मिलानकर्ता कहां जाने वाले हैं।

एक तरफ, इन मामलों का पता लगाने और त्रुटि संदेशों को NSubstitute के अगले संस्करण (3.1 के बाद) के साथ सुधारने के लिए सेट किया गया है।

2
David Tchepak 7 मई 2018, 12:27

ऐसा प्रतीत होता है कि NSubstitute में किसी प्रकार की पूर्णता जाँच है जो Arg.Is वाली प्राप्त कॉलों का मूल्यांकन करते समय चलती है।

Arg.Is एक रिसीव्ड कॉल में है, या कॉल नहीं कर रहा है .Received, या Orphan तर्क पर टिप्पणी करना इसे ठीक करने के लिए प्रतीत होता है, लेकिन मुझे नहीं पता कि क्यों।

0
Ryan The Leach 7 मई 2018, 10:04