【发布时间】:2021-02-10 10:34:02
【问题描述】:
我编写了一个 JavaScript 函数,它从 require() 的库中创建一个对象,然后使用它。当我尝试为它编写测试时,这似乎给我带来了麻烦,因为我似乎没有一个好的方法来控制该对象并创建其方法的模拟来测试我的函数的行为。
我遇到这种情况是因为我设计的功能很差吗?我来自 Java/Spring 背景,所以我脑海中的声音在尖叫“依赖注入”。除了将我的函数需要的对象作为参数传递给它之外,还有更好的方法吗?
示例函数:
// dbService.js
const AWS = require('aws-sdk');
function getItem() {
const dynamo = new AWS.DynamoDB.DocumentClient();
var params = {/* irrelevant */}
try {
return await dynamo.get(getParams).promise();
} catch (err) {
return err;
}
}
exports.getItem = getItem;
当我尝试编写测试以验证我的函数在 dynamo.get() 成功返回或抛出错误时的行为时,我开始遇到问题。
示例测试(我一直使用 Sinon 进行模拟,使用 Chai 进行断言):
// dbServiceTest.js
const sinon = require('sinon');
const dbService = require('dbService.js');
const expect = require('chai').expect;
describe('dbService: When database returns a record', function() {
let dbMock, dbServiceResp = null;
beforeEach(async function() {
dbMock = sinon.stub(dynamo, "get")
.returns({Item: "an item"});
dbServiceResp = await dbService.getItem("an item");
});
afterEach(function() {
dbMock.restore();
});
it('Should have expected value', function() {
expect(dbServiceResp.Item).to.be.equal("an item");
});
});
很明显,dbService.getItem() 没有使用我创建的 dynamo.get() 模拟,因为 dbService.getItem() 完全拥有它自己对 DocumentClient 对象的依赖项的实例化。
我应该将DocumentClient 传递给我的getItem() 函数,还是有更好的方法?
【问题讨论】:
标签: javascript mocking chai sinon stub