الفرق بين المراجعتين لصفحة: «React/test utils»
Kinan-mawed (نقاش | مساهمات) لا ملخص تعديل |
Kinan-mawed (نقاش | مساهمات) لا ملخص تعديل |
||
سطر 9: | سطر 9: | ||
== لمحة عامة == | == لمحة عامة == | ||
تزيد أدوات الاختبار <code>ReactTestUtils</code> من سهولة اختبار مكوّنات React في إطار عمل الاختبار الذي تريده. يستخدم Facebook الأداة Jest لاختبار JavaScript بسهولة. تعلم كيفية البدء مع Jest عبر درس React في موقع Jest. | تزيد أدوات الاختبار <code>ReactTestUtils</code> من سهولة اختبار مكوّنات React في إطار عمل الاختبار الذي تريده. يستخدم Facebook الأداة [https://facebook.github.io/jest/ Jest] لاختبار JavaScript بسهولة. تعلم كيفية البدء مع Jest عبر [http://facebook.github.io/jest/docs/en/tutorial-react.html#content درس React] في موقع Jest. | ||
'''ملاحظة:''' أطلقت Airbnb أداة اختبار تُدعى Enzyme والتي تجعل من السهل التعامل مع ناتج مكوّناتك. إن قرّرت استخدام أداة اختبار أخرى مع Jest فقد تستحق تجربتها من هنا. | '''ملاحظة:''' أطلقت Airbnb أداة اختبار تُدعى Enzyme والتي تجعل من السهل التعامل مع ناتج مكوّناتك. إن قرّرت استخدام أداة اختبار أخرى مع Jest فقد تستحق تجربتها [http://airbnb.io/enzyme/ من هنا]. | ||
هنالك أداة بديلة أخرى تُدعى <code>react-testing-library</code> مُصمَّمة لتمكين وتشجيع كتابة اختبارات لاستخدامها مع مكوّناتك بينما يستخدمها المستخدم النهائي. تعمل أيضًا مع أي مُشغِّل اختبار. | هنالك أداة بديلة أخرى تُدعى <code>[https://git.io/react-testing-library react-testing-library]</code> مُصمَّمة لتمكين وتشجيع كتابة اختبارات لاستخدامها مع مكوّناتك بينما يستخدمها المستخدم النهائي. تعمل أيضًا مع أي مُشغِّل اختبار. | ||
== مرجع == | == مرجع == | ||
سطر 20: | سطر 20: | ||
عند كتابة وحدات اختبار لمكتبة React يكون التصيير السطحي مفيدًا لك. يُتيح لك التصيير السطحي تصيير مكوّن على عمق مستوى واحد وتوضيح الحقائق حول ما يُعيده تابع التصيير، بدون القلق حول سلوك المكوّنات الأبناء والتي لم تُصيَّر أو ينشأ عنها نسخة. لا يحتاج ذلك إلى DOM. | عند كتابة وحدات اختبار لمكتبة React يكون التصيير السطحي مفيدًا لك. يُتيح لك التصيير السطحي تصيير مكوّن على عمق مستوى واحد وتوضيح الحقائق حول ما يُعيده تابع التصيير، بدون القلق حول سلوك المكوّنات الأبناء والتي لم تُصيَّر أو ينشأ عنها نسخة. لا يحتاج ذلك إلى DOM. | ||
ملاحظة: انتقل التصيير السطحي إلى <code>react-test-renderer/shallow</code>. تعلم المزيد حول التصيير السطحي في صفحة التوثيق الخاصّة به. | ملاحظة: انتقل التصيير السطحي إلى <code>react-test-renderer/shallow</code>. تعلم المزيد حول [[React/shallow renderer|التصيير السطحي]] في صفحة التوثيق الخاصّة به. | ||
=== أدوات أخرى === | === أدوات أخرى === | ||
سطر 33: | سطر 33: | ||
</syntaxhighlight>محاكاة حدث في عقدة DOM مع خيار إضافي لبيانات الأحداث <code>eventData</code>. | </syntaxhighlight>محاكاة حدث في عقدة DOM مع خيار إضافي لبيانات الأحداث <code>eventData</code>. | ||
تمتلك الأداة Simulate تابعًا لكل حدث تفهمه React. | تمتلك الأداة Simulate تابعًا [[React/events#.D8.A7.D9.84.D8.A3.D8.AD.D8.AF.D8.A7.D8.AB .D8.A7.D9.84.D9.85.D8.AF.D8.B9.D9.88.D9.85.D8.A9|لكل حدث تفهمه React]]. | ||
الضغط على العنصر:<syntaxhighlight lang="javascript"> | الضغط على العنصر:<syntaxhighlight lang="javascript"> | ||
سطر 65: | سطر 65: | ||
</syntaxhighlight>تمرير وحدة المكوّن المحاكي إلى هذا التابع لتزويد المكوّن بتوابع مفيدة، فبدلًا من التصيير الاعتيادي سيصبح المكوّن عنصر <code>div</code> بسيط (أو أي عنصر آخر ندخله ضمن الوسيط <code>mockTagName</code>) يحتوي على أي مكوّن ابن نعطيه له. | </syntaxhighlight>تمرير وحدة المكوّن المحاكي إلى هذا التابع لتزويد المكوّن بتوابع مفيدة، فبدلًا من التصيير الاعتيادي سيصبح المكوّن عنصر <code>div</code> بسيط (أو أي عنصر آخر ندخله ضمن الوسيط <code>mockTagName</code>) يحتوي على أي مكوّن ابن نعطيه له. | ||
'''ملاحظة:''' <code>mockComponent()</code> هي واجهة برمجة تطبيق قديمة. نوصي باستخدام التصيير السطحي أو <code>jest.mock()</code> بدلًا من ذلك. | '''ملاحظة:''' <code>mockComponent()</code> هي واجهة برمجة تطبيق قديمة. نوصي باستخدام [[React/test utils#.D8.A7.D9.84.D8.AA.D8.B5.D9.8A.D9.8A.D8.B1 .D8.A7.D9.84.D8.B3.D8.B7.D8.AD.D9.8A .28Shallow Rendering.29|التصيير السطحي]] أو <code>[https://facebook.github.io/jest/docs/en/tutorial-react-native.html#mock-native-modules-using-jestmock jest.mock()]</code> بدلًا من ذلك. | ||
==== <code>isElement()</code> ==== | ==== <code>isElement()</code> ==== | ||
سطر 162: | سطر 162: | ||
</syntaxhighlight>مثل <code>scryRenderedComponentsWithType()</code> ولكن يتوقّع وجود نتيجة واحدة، ويُعيد تلك النتيجة، أو يرمي استثناء إن كان عدد المكوّنات المطابقة أكثر من واحد. | </syntaxhighlight>مثل <code>scryRenderedComponentsWithType()</code> ولكن يتوقّع وجود نتيجة واحدة، ويُعيد تلك النتيجة، أو يرمي استثناء إن كان عدد المكوّنات المطابقة أكثر من واحد. | ||
==مصادر== | |||
*[https://reactjs.org/docs/test-utils.html صفحة أدوات الاختبار في توثيق React الرسمي]. | |||
[[تصنيف:React]] |
مراجعة 03:17، 9 سبتمبر 2018
استيراد الأدوات
import ReactTestUtils from 'react-dom/test-utils'; // ES6
var ReactTestUtils = require('react-dom/test-utils'); // ES5 with npm
لمحة عامة
تزيد أدوات الاختبار ReactTestUtils
من سهولة اختبار مكوّنات React في إطار عمل الاختبار الذي تريده. يستخدم Facebook الأداة Jest لاختبار JavaScript بسهولة. تعلم كيفية البدء مع Jest عبر درس React في موقع Jest.
ملاحظة: أطلقت Airbnb أداة اختبار تُدعى Enzyme والتي تجعل من السهل التعامل مع ناتج مكوّناتك. إن قرّرت استخدام أداة اختبار أخرى مع Jest فقد تستحق تجربتها من هنا.
هنالك أداة بديلة أخرى تُدعى react-testing-library
مُصمَّمة لتمكين وتشجيع كتابة اختبارات لاستخدامها مع مكوّناتك بينما يستخدمها المستخدم النهائي. تعمل أيضًا مع أي مُشغِّل اختبار.
مرجع
التصيير السطحي (Shallow Rendering)
عند كتابة وحدات اختبار لمكتبة React يكون التصيير السطحي مفيدًا لك. يُتيح لك التصيير السطحي تصيير مكوّن على عمق مستوى واحد وتوضيح الحقائق حول ما يُعيده تابع التصيير، بدون القلق حول سلوك المكوّنات الأبناء والتي لم تُصيَّر أو ينشأ عنها نسخة. لا يحتاج ذلك إلى DOM.
ملاحظة: انتقل التصيير السطحي إلى react-test-renderer/shallow
. تعلم المزيد حول التصيير السطحي في صفحة التوثيق الخاصّة به.
أدوات أخرى
Simulate
Simulate.{eventName}(
element,
[eventData]
)
محاكاة حدث في عقدة DOM مع خيار إضافي لبيانات الأحداث eventData
.
تمتلك الأداة Simulate تابعًا لكل حدث تفهمه React.
الضغط على العنصر:
// <button ref={(node) => this.button = node}>...</button>
const node = this.button;
ReactTestUtils.Simulate.click(node);
تغيير القيمة لحقل الإدخال ثمّ الضغط على ENTER
:
// <input ref={(node) => this.textInput = node} />
const node = this.textInput;
node.value = 'giraffe';
ReactTestUtils.Simulate.change(node);
ReactTestUtils.Simulate.keyDown(node, {key: "Enter", keyCode: 13, which: 13});
ملاحظة: يجب عليك تزويد أي خاصيّة حدث تستخدمها في مكوّنك (مثل KeyCode
، و Which
، إلخ...) لأنّ React لا تُنشِئ أي من هذه الخاصيّات لأجلك.
renderIntoDocument()
renderIntoDocument(element)
تصيير عنصر React في عقدة DOM منفصلة في المستند. تتطلّب هذه الدالة قابلية الوصول إلى DOM.
ملاحظة: تحتاج إلى أن تكون window
، و window.document
، و window.document.createElement
متوفرة لديك بشكل عام (global) قبل استيراد React، وإلّا ستعتقد React أنّها لا تستطيع الوصول إلى DOM ولن تعمل توابع مثل setState
.
mockComponent()
mockComponent(
componentClass,
[mockTagName]
)
تمرير وحدة المكوّن المحاكي إلى هذا التابع لتزويد المكوّن بتوابع مفيدة، فبدلًا من التصيير الاعتيادي سيصبح المكوّن عنصر div
بسيط (أو أي عنصر آخر ندخله ضمن الوسيط mockTagName
) يحتوي على أي مكوّن ابن نعطيه له.
ملاحظة: mockComponent()
هي واجهة برمجة تطبيق قديمة. نوصي باستخدام التصيير السطحي أو jest.mock()
بدلًا من ذلك.
isElement()
isElement(element)
يُعيد القيمة true
إن كان الوسيط element
عبارة عن عنصر React.
isElementOfType()
isElementOfType(
element,
componentClass
)
يُعيد القيمة true
إن كان الوسيط element
عبارة عن عنصر React نوعه هو componentClass
.
isDOMComponent()
isDOMComponent(instance)
يُعيد القيمة true
إن كان الوسيط instance
هو مكوّن DOM (مثل div
أو span
).
isCompositeComponent()
isCompositeComponent(instance)
يُعيد القيمة true
إن كان الوسيط instance
عبارة عن مكوّن مُعرَّف من قبل المستخدم كالأصناف أو الدوال.
isCompositeComponentWithType()
isCompositeComponentWithType(
instance,
componentClass
)
يُعيد القيمة true
إن كان الوسيط instance
عبارة عن مكوّن من النوع componentClass
.
findAllInRenderedTree()
findAllInRenderedTree(
tree,
test
)
التنقل عبر مكوّنات شجرة المكوّنات وجمع كل المكوّنات حيث يكون test(component)
قيمته true
. لا يكون هذا مفيدًا بحد ذاته ولكنّه يُستخدَم كبداية لأدوات اختبار أخرى.
scryRenderedDOMComponentsWithClass()
scryRenderedDOMComponentsWithClass(
tree,
className
)
إيجاد جميع مكوّنات عناصر DOM في الشجرة المُصيَّرة والتي هي مكوّنات DOM لها اسم صنف يُطابِق المذكور في الوسيط className
.
findRenderedDOMComponentWithClass()
findRenderedDOMComponentWithClass(
tree,
className
)
مثل scryRenderedDOMComponentsWithClass()
ولكن يتوقّع وجود نتيجة واحدة، ويُعيد تلك النتيجة، أو يرمي استثناء إن كان عدد المكوّنات المطابقة أكثر من واحد.
scryRenderedDOMComponentsWithTag()
scryRenderedDOMComponentsWithTag(
tree,
tagName
)
إيجاد جميع مكوّنات عناصر DOM في الشجرة المُصيَّرة والتي هي مكوّنات DOM لها اسم للوسم يُطابِق المذكور في الوسيط tagName
.
findRenderedDOMComponentWithTag()
findRenderedDOMComponentWithTag(
tree,
tagName
)
مثل scryRenderedDOMComponentsWithTag()
ولكن يتوقّع وجود نتيجة واحدة، ويُعيد تلك النتيجة، أو يرمي استثناء إن كان عدد المكوّنات المطابقة أكثر من واحد.
scryRenderedComponentsWithType()
scryRenderedComponentsWithType(
tree,
componentClass
)
إيجاد جميع نسخ المكوّنات التي نوعها يُساوي componentClass
.
findRenderedComponentWithType()
findRenderedComponentWithType(
tree,
componentClass
)
مثل scryRenderedComponentsWithType()
ولكن يتوقّع وجود نتيجة واحدة، ويُعيد تلك النتيجة، أو يرمي استثناء إن كان عدد المكوّنات المطابقة أكثر من واحد.