بديل:التحقق من الأساليب المستلمة باستخدام وسيطات الصفيف

StackOverflow https://stackoverflow.com//questions/12699066

  •  12-12-2019
  •  | 
  •  

سؤال

أريد التحقق من أن الطريقة الموجودة على نموذج NSubstitute الخاص بي يتم استدعاؤها باستخدام وسيطة صفيف معينة.

قل الواجهة IProcessor, ، لديه طريقة void ProcessSomething(Foo[] something]).لنفترض أن صفي قيد الاختبار تم تسميته Commander.لقد قمت بإعداد الاختبار الخاص بي مثل هذا:

//prepare
var processor = Substitute.For<IProcessor>;
var commander = new Commander(processor);
var foo1 = new Foo("alpha");
var foo2 = new Foo("bravo");
var foos = new [] {foo1, foo2};

//act
commander.DoSomething(foo1, foo2);

//verify
processor.Received().ProcessSomething(foos);  // FAILS

ال Received() فشل الاتصال مع:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
    ProcessSomething(Foo[])
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
    ProcessSomething(*Foo[]*)

لذلك يبدو أنه تم استدعاء ProcessSomething بمصفوفة أخرى غير foos, ، يمين؟

حسنًا، إذا قمت بدلاً من ذلك باختبار هذا، حيث يمكنني التقاط قيمة الوسيطة باستخدام Arg.Do(), ، ينجح:

//prepare
//... as before
var actualFoos = null;

processor.ProcessSomething(Arg.Do<Foo[]>(x => actualFoos = x));

//act
commander.DoSomething(foo1, foo2);

//verify
Assert.That(actualFoos, Is.EqualTo(foos));   // SUCCEEDS

لذا فإن التقاط الوسيطة ومقارنتها بالمساواة (مع NUnit في هذا المثال) يعمل، ولكن فشل التحقق من المكالمة المستلمة.

هل هذا خطأ في NSubstitute أم أنني أستخدمه بشكل خاطئ؟

هل كانت مفيدة؟

المحلول

أفترض أن الخاص بك Commander سيأخذ الكائن الوسائط ويضعها في مصفوفة يستخدمها بعد ذلك لاستدعاء Processor وهمية.

لك foos المتغير هو مصفوفة أخرى تقوم بإنشائها في الإعداد الخاص بك.لا يمكن مقارنة المصفوفات بالتساوي حتى لو كانت تحتوي على نفس العناصر.لذلك سوف يشكو NSubstitute من أنه لم يتلق القيمة المتوقعة (لقد تلقى مصفوفة أخرى تحتوي على نفس العناصر).

يحرر: جرب هذا الإصدار:

//prepare
var processor = Substitute.For<IProcessor>;
var commander = new Commander(processor);
var foo1 = new Foo("alpha");
var foo2 = new Foo("bravo");
var foos = new [] {foo1, foo2};

//act
commander.DoSomething(foo1, foo2);

//verify
processor.Received().ProcessSomething(Arg.Is<Foo[]>(foos2 => foos.SequenceEqual(foos2));

وهذا يتطلب استيراد System.Linq مساحة الاسم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top