測試替身,也稱為模擬 (mocks)、存根 (stubs) 或虛擬 (fakes),用於測試中以模擬的依賴項取代真實的依賴項,以隔離正在測試的程式碼。Nightwatch 透過其模擬命令提供對測試替身的支持,讓您能為依賴項建立存根和模擬。

安裝

1) 從 NPM 安裝外掛程式
npm i @nightwatch/testdoubles --save-dev
2) 新增組態

編輯您的 nightwatch.json (或 nightwatch.conf.js) 檔案並新增以下內容

nightwatch.conf.js
module.exports = {
  plugins: ['@nightwatch/testdoubles']

  // other Nightwatch settings...
}
3) 停用瀏覽器 Session

我們還需要關閉瀏覽器 Session,因為我們只執行單元測試。這可以透過設定這些屬性來完成

nightwatch.conf.js
module.exports = {
  // ....
  testdoubles: {
    start_session: false,
    webdriver: {
      start_process: false,
    }
  }
}

需要 Nightwatch 2.6.4 或更高版本。

用法

安裝 @nightwatch/testdoubles 並新增至組態檔後,您可以在測試案例中使用 sinon 物件來建立測試替身。以下是一些範例

Spy

Spy 是一個函數,它會記錄有關其呼叫的一些中繼資料,例如呼叫次數、呼叫時使用的引數等等。Spy 對於驗證函數是否被呼叫或檢查呼叫時使用的引數非常有用。

spy.js

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 是一個函數,它會以「虛擬」實作取代原始函數。當您需要在測試期間控制函數的行為時,例如模擬錯誤狀況,這會很有用。

stub.js
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() 會執行檢查並報告錯誤。

mock.js

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_sessionwebdriver -> start_process 設定為 false

npx nightwatch <path to tests> --env testdoubles

我們希望這些範例能幫助您開始在 Nightwatch 測試中使用 @nightwatch/testdoubles