محاكاة
قم بمحاكاة استجابة طلب. يمكنك تحديد محاكاة استنادًا إلى نمط URL متطابق URLPattern والرأس ورمز الحالة المقابلين. استدعاء طريقة المحاكاة يعيد كائن stub يمكنك استخدامه لتعديل استجابة مورد الويب.
باستخدام كائن stub، يمكنك بعد ذلك إما إرجاع استجابة مخصصة أو جعل الطلب يفشل.
هناك 3 طرق لتعديل الاستجابة:
- إرجاع كائن JSON مخصص (لمحاكاة طلب API)
- استبدال مورد الويب بملف محلي (تقديم ملف JavaScript معدّل) أو
- إعادة توجيه المورد إلى عنوان URL مختلف
لاحظ أن استخدام أمر mock
يتطلب دعمًا لـ WebDriver Bidi. وهذا
عادة ما يكون هو الحال عند تشغيل الاختبارات محليًا في متصفح يعتمد على Chromium أو على
Firefox وكذلك إذا كنت تستخدم Selenium Grid v4 أو أعلى. إذا كنت تشغل اختبارات
في السحابة، تأكد من أن مزود السحابة الخاص بك يدعم WebDriver Bidi.
URLPattern
عبارة عن تقنية تجريبية وليست مدعومة بعد في بعض البيئات، على سبيل المثال Node.js.
نوصي باستيراد polyfill
حتى يتم دعم الميزة على نطاق أوسع.
الاستخدام
browser.mock(url, { method, requestHeaders, responseHeaders, postData, statusCode })
المعلمات
الاسم | النوع | التفاصيل |
---|---|---|
url | String | عنوان URL المراد محاكاته |
filterOptions اختياري | MockFilterOptions | تصفية مورد المحاكاة حسب خيارات إضافية |
filterOptions.method اختياري | String, Function | تصفية المورد حسب طريقة HTTP |
filterOptions.requestHeaders اختياري | Object, Function | تصفية المورد حسب رؤوس طلب محددة |
filterOptions.responseHeaders اختياري | Object, Function | تصفية المورد حسب رؤوس استجابة محددة |
filterOptions.postData اختياري | String, Function | تصفية المورد حسب بيانات الإرسال في الطلب |
filterOptions.statusCode اختياري | Number, Function | تصفية المورد حسب رمز حالة الاستجابة |
مثال
it('should mock network resources', async () => {
// via static string
const userListMock = await browser.mock('**' + '/users/list')
// or as regular expression
const userListMock = await browser.mock(/https:\/\/(domainA|domainB)\.com\/.+/)
// you can also specifying the mock even more by filtering resources
// by request or response headers, status code, postData, e.g. mock only responses with specific
// header set and statusCode
const strictMock = await browser.mock('**', {
// mock all json responses
statusCode: 200,
requestHeaders: { 'Content-Type': 'application/json' },
responseHeaders: { 'Cache-Control': 'no-cache' },
postData: 'foobar'
})
// comparator function
const apiV1Mock = await browser.mock('**' + '/api/v1', {
statusCode: (statusCode) => statusCode >= 200 && statusCode <= 203,
requestHeaders: (headers) => headers['Authorization'] && headers['Authorization'].startsWith('Bearer '),
responseHeaders: (headers) => headers['Impersonation'],
postData: (data) => typeof data === 'string' && data.includes('foo')
})
})
it('should modify API responses', async () => {
// filter by method
const todoMock = await browser.mock('**' + '/todos', {
method: 'get'
})
// mock an endpoint with a fixed fixture
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}])
// respond with different status code or header
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}], {
statusCode: 404,
headers: {
'x-custom-header': 'foobar'
}
})
})
it('should modify text assets', async () => {
const scriptMock = await browser.mock('**' + '/script.min.js')
scriptMock.respond('./tests/fixtures/script.js')
})
it('should redirect web resources', async () => {
const headerMock = await browser.mock('**' + '/header.png')
headerMock.respond('https://media.giphy.com/media/F9hQLAVhWnL56/giphy.gif')
const pageMock = await browser.mock('https://google.com/')
pageMock.respond('https://webdriver.io')
await browser.url('https://google.com')
console.log(await browser.getTitle()) // returns "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js"
})
القيمة المرجعة
- <Mock>
return
: كائن محاكاة لتعديل الاستجابة