قم بزيارة موقع NSubstitute لمزيد من المعلومات.
تم تصميم NSubstitute كبديل سهل الاستخدام لمكتبات .NET الساخرة.
إنها محاولة لإشباع رغبتنا في الحصول على مكتبة ساخرة من خلال بناء جملة موجز يساعدنا في الحفاظ على التركيز على غرض اختباراتنا، بدلاً من تكوين اختباراتنا المزدوجة. لقد حاولنا أن نجعل العمليات المطلوبة بشكل متكرر واضحة وسهلة الاستخدام، مع الحفاظ على السيناريوهات الأقل اعتيادية قابلة للاكتشاف والوصول إليها، مع الحفاظ على أكبر قدر ممكن من اللغة الطبيعية.
مثالي لأولئك الجدد في الاختبار، وللآخرين الذين يرغبون فقط في كتابة اختباراتهم بضوضاء أقل وعدد أقل من لامدا.
إذا كانت لديك أسئلة أو طلبات ميزات أو تعليقات على NSubstitute، فيرجى إثارة مشكلة على موقع مشروعنا. نرحب بجميع الأسئلة عبر موقع مشروعنا، ولكن بالنسبة للأسئلة ذات النمط "الكيفية"، يمكنك أيضًا تجربة StackOverflow باستخدام العلامة [nsubstitute]، والتي غالبًا ما تؤدي إلى إجابات جيدة جدًا من مجتمع البرمجة الأكبر. يعد StackOverflow مفيدًا بشكل خاص إذا كان سؤالك يتعلق أيضًا بمكتبات أخرى قد لا يكون فريقنا على دراية بها (على سبيل المثال NSubstitute with Entity Framework).
لنفترض أن لدينا واجهة الآلة الحاسبة الأساسية:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
يمكننا أن نطلب من NSubstitute إنشاء نسخة بديلة لهذا النوع. يمكننا أن نطلب كعب روتين، أو وهمي، أو مزيف، أو تجسس، أو اختبار مزدوج وما إلى ذلك، ولكن لماذا نهتم عندما نريد فقط استبدال مثيل لدينا بعض السيطرة عليه؟
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
. كن حذرًا عند استبدال الفصول الدراسية بأعضاء غير افتراضيين. راجع إنشاء بديل لمزيد من المعلومات.
يمكننا الآن أن نطلب من البديل أن يُرجع قيمة لمكالمة:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
يمكننا التحقق من أن بديلنا قد تلقى مكالمة ولم يتلق مكالمة أخرى:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
إذا فشل تأكيد التلقي () الخاص بنا، فإن NSubstitute يحاول أن يقدم لنا بعض المساعدة فيما يتعلق بالمشكلة المحتملة:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
يمكننا أيضًا العمل مع الخصائص باستخدام صيغة الإرجاع التي نستخدمها للطرق، أو الالتزام فقط بمحددات الخصائص القديمة (لخصائص القراءة/الكتابة):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
يدعم NSubstitute مطابقة الوسيطات لتعيين قيم الإرجاع والتأكيد على تلقي مكالمة:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
يمكننا استخدام مطابقة الوسيطات بالإضافة إلى تمرير دالة إلى Returns() للحصول على المزيد من السلوك من بديلنا (ربما أكثر من اللازم، ولكن هذا هو خيارك):
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;
يمكن أيضًا استدعاء Returns() باستخدام وسائط متعددة لإعداد سلسلة من قيم الإرجاع.
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;
أخيرًا، يمكننا رفع الأحداث على بدائلنا (لسوء الحظ فإن لغة #C تقيد بشكل كبير مدى إمكانية تنظيف بناء الجملة هذا):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
يمكن تجميع NSubstitute واختباراته وتشغيلها باستخدام Visual Studio أو Visual Studio Code أو أي محرر آخر يدعم .NET. لاحظ أن بعض الاختبارات تم وضع علامة [Pending]
عليها وليس من المفترض أن تنجح في الوقت الحالي، لذلك من الجيد استبعاد الاختبارات الموجودة في الفئة "معلقة" من عمليات تشغيل الاختبار.
توجد أيضًا برامج نصية للإنشاء في دليل ./build
لإنشاءات سطر الأوامر، وتكوينات CI في جذر المشروع.
للقيام بالبنيات الكاملة، ستحتاج أيضًا إلى روبي، حيث يتم استخدام جوهرة jekyll لإنشاء موقع الويب.
@fluffy-spoon/substitute
on NPM)