بديل:التحقق من الأساليب المستلمة باستخدام وسيطات الصفيف
-
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
مساحة الاسم