簡體   English   中英

單元測試連接數據庫的異步函數

[英]Unit testing asynchronous function which connects to database

我有一些連接到數據庫(redis)並返回一些數據的函數,這些函數通常基於promises但是是異步的並且包含流。 我查看並閱讀了一些關於測試的內容,我選擇使用磁帶 ,sinon和proxyquire,如果我嘲笑這個函數我怎么知道它有效?

以下函數(listKeys)在完成掃描后返回(通過promise)redis db中存在的所有鍵。

let methods = {
    client: client,
    // Cache for listKeys
    cacheKeys: [],
    // Increment and return through promise all keys
    // store to cacheKeys;
    listKeys: blob => {
        return new Promise((resolve, reject) => {
            blob = blob ? blob : '*';

            let stream = methods.client.scanStream({
                match: blob,
                count: 10,
            })

            stream.on('data', keys => {
                for (var i = 0; i < keys.length; i++) {
                    if (methods.cacheKeys.indexOf(keys[i]) === -1) {
                        methods.cacheKeys.push(keys[i])
                    }
                }
            })

            stream.on('end', () => {
                resolve(methods.cacheKeys)
            })

            stream.on('error', reject)
        })
    }
}

那么你如何測試這樣的功能呢?

我認為有幾種方法可以通過測試來執行此功能,並且所有方法都圍繞配置測試使用的測試流。

我喜歡編寫我認為最重要的測試用例,然后找出實現它們的方法。 對我來說最重要的是像

it('should resolve cacheKeys on end')

然后需要創建一個流來提供您的功能

var Stream = require('stream');
var stream = new Stream();

然后掃描流需要由您的測試控制

你可以通過創建一個假客戶端來做到這一點

client = {
  scanStream: (config) => { return stream }
}

然后可以使用您的斷言配置測試

var testKeys = ['t'];

Method.listKeys().then((cacheKeys) => { 

  assert(cacheKeys).toEqual(testKeys);
  done() 
})

現在您的承諾正在等待您的流,並使用斷言將數據發送到流。

stream.emit('data', testKeys)

一種簡單的方法,通過模擬數據庫流,在其上發送數據並檢查是否正確保存,來測試密鑰是否正確保存到cacheKeys。 例如:

// Create a mock stream to substitute database
var mockStream = new require('stream').Readable();

// Create a mock client.scanStream that returns the mocked stream
var client = {
    scanStream: function () {
        return mockStream;
    }
};

// Assign the mocks to methods
methods.client = client;

// Call listKeys(), so the streams get prepared and the promise awaits resolution
methods.listKeys()
    .then(function (r) {
        // Setup asserts for correct results here
        console.log('Promise resolved with: ', r);
    });

// Send test data over the mocked stream
mockStream.emit('data', 'hello');

// End the stream to resolve the promise and execute the asserts
mockStream.emit('end');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM