Nightwatch 中的測試替身
測試替身,也稱為模擬 (mocks)、存根 (stubs) 或虛擬 (fakes),用於測試中以模擬的依賴項取代真實的依賴項,以隔離正在測試的程式碼。Nightwatch 透過其模擬命令提供對測試替身的支持,讓您能為依賴項建立存根和模擬。
安裝
1) 從 NPM 安裝外掛程式
npm i @nightwatch/testdoubles --save-dev
2) 新增組態
編輯您的 nightwatch.json
(或 nightwatch.conf.js
) 檔案並新增以下內容
module.exports = {
plugins: ['@nightwatch/testdoubles']
// other Nightwatch settings...
}
3) 停用瀏覽器 Session
我們還需要關閉瀏覽器 Session,因為我們只執行單元測試。這可以透過設定這些屬性來完成
module.exports = {
// ....
testdoubles: {
start_session: false,
webdriver: {
start_process: false,
}
}
}
需要 Nightwatch 2.6.4 或更高版本。
用法
安裝 @nightwatch/testdoubles
並新增至組態檔後,您可以在測試案例中使用 sinon 物件來建立測試替身。以下是一些範例
Spy
Spy 是一個函數,它會記錄有關其呼叫的一些中繼資料,例如呼叫次數、呼叫時使用的引數等等。Spy 對於驗證函數是否被呼叫或檢查呼叫時使用的引數非常有用。
describe('use spies in nightwatch', function() {
it('should log message when called', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const spy = sinon.spy(obj, 'hello'); // create a spy on hello
sayHello();
assert(spy.calledOnce); // assert that the spy was called once
spy.restore(); // restore original hello function
})
})
此範例會在物件的 hello 方法上建立一個 spy,然後呼叫 sayHello
函數。斷言檢查 spy 是否被呼叫一次。最後,spy 會還原為其原始狀態。
Stubs
Stub 是一個函數,它會以「虛擬」實作取代原始函數。當您需要在測試期間控制函數的行為時,例如模擬錯誤狀況,這會很有用。
describe('use stubs in nightwatch', function() {
it('stub hello', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const stub = sinon.stub(obj, 'hello').returns('hi'); // replace hello with a dummy implementation that returns 'hi'
const result = sayHello();
assert.strictEqual(result, 'hi'); // check that the stubbed function returned 'hi'
});
});
此範例會在 console.log 方法上建立一個 stub,然後使用引數 'Hello!' 呼叫它。斷言檢查 stub 是否被呼叫一次,並帶有預期的引數。最後,stub 會還原為其原始狀態。
Mocks
Mock 是一個「模擬」物件的函數,也就是說,它會建立與真實物件具有相同介面的虛擬版本。您可以在 mock 物件上設定期望值,即指定應呼叫哪些方法以及使用哪些引數,mock 會驗證這些期望值是否在測試期間得到滿足。
建立 mock 會自動將 Nightwatch 斷言附加到它。如果檢查失敗,mock.verify() 會執行檢查並報告錯誤。
describe('use mocks in nightwatch', function() {
it('mock hello obj', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const mock = sinon.mock(obj).expects('hello').atLeast(1).returns(null); //set a mock on hello
sayHello();
mock.verify(); // mocks comes with inbuilt assertion
})
})
此範例會在物件的 hello 方法上建立一個 mock,然後呼叫 sayHello 函數。mock.verify() 方法會檢查 mock 是否至少被呼叫一次。最後,mock 會還原為其原始狀態。
如需更多關於如何使用 spy、stub 和 mock 的資訊,請參閱 Sinon.js 文件。
執行 API 測試
確保 API 測試針對 environment
執行,其中 start_session
和 webdriver -> start_process
設定為 false
。
npx nightwatch <path to tests> --env testdoubles
我們希望這些範例能幫助您開始在 Nightwatch 測試中使用 @nightwatch/testdoubles
!