- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想找出一种在这个模块中模拟 redis 的方法:
const Redis = require('ioredis');
const myFunction = {
exists: (thingToCheck) {
let redis_client = new Redis(
6379,
process.env.REDIS_URL,
{
connectTimeout: 75,
dropBufferSupport: true,
retryStrategy: functionHere
});
redis_client.exists(thingToCheck, function (err, resp) {
// handlings in here
});
}
};
使用这个测试代码:
const LambdaTester = require('lambda-tester');
const chai = require('chai');
const expect = chai.expect;
const sinon = require('sinon');
const mockRedis = sinon.mock(require('ioredis'));
describe( 'A Redis Connection error', function() {
before(() => {
mockRedis.expects('constructor').returns({
exists: (sha, callback) => {
callback('error!', null);
}
});
});
it( 'It returns a database error', function() {
return LambdaTester(lambdaToTest)
.event(thingToCheck)
.expectError((err) => {
expect(err.message).to.equal('Database error');
});
});
});
我也尝试了一些变体,但我有点卡住了,因为我基本上需要模拟构造函数,但我不确定 Sinon 是否支持这个?
mockRedis.expects('exists').returns(
(thing, callback) => {
callback('error!', null);
}
);
sinon.stub(mockRedis, 'constructor').callsFake(() => console.log('test!'));
sinon.stub(mockRedis, 'exists').callsFake(() => console.log('test!'));
不确定在这里还能尝试什么,我也尝试使用 rewire按照建议here ,但使用 mockRedis.__set__("exists", myMock);
从不设置该私有(private)变量。
我最终想伪造我的错误路径。
我很想听听其他人在做什么来测试节点 js 中的 redis 😄。
最佳答案
您的问题不在于 Sinon 是否支持这个或那个,而是缺少对“类”在 Ecmascript 中的工作方式的理解,如在测试代码中试图 stub constructor
属性所示。这永远行不通,因为该属性与任何结果对象的结果无关。它只是对用于创建对象的函数的引用。我已经涵盖了a very similar topic on the Sinon tracker您可能有兴趣阅读以获得一些核心 JS foo :-) 基本上,不可能对构造函数进行 stub ,但您可以通过 DI 或链接接缝强制您的代码在其位置使用另一个构造函数。
事实上,在同一个线程中有几个答案,您会看到我介绍了一个示例,说明我自己如何设计一个 Redis 使用类,以便通过支持依赖注入(inject)轻松测试。你可能想要 to check it out ,因为它或多或少直接适用于您上面的示例模块。
您已经尝试过的另一种技术是使用链接接缝(使用rewire
)。 Sinon 主页有一个 nice article这样做。 rewire
和 proxyquire
都可以很好地完成这里的工作:我认为您只是通过用 mock 包装 require 语句使事情复杂化了一点。
尽管我是 Sinon 维护者团队的一员,但我从未使用过 mock
功能,所以我不能告诉你如何使用它,因为我认为它掩盖了测试,但为了获得基本的使用 rewire
链接接缝工作 我基本上会先删除所有 Sinon 代码,然后开始基本案例(删除 redis
用于您创建的 stub 模块)。
然后,根据需要添加 Sinon 代码。
关于javascript - 用 Sinon 模拟 Redis 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294170/
我有一个正在 stub 的函数,该函数使用多个参数进行调用。我想检查仅第一个参数。其余的都是回调函数,所以我不想管它们。因此,我可能有以下 2 个调用,以 ajax 为例: method.get =
我试图用 Sinon.js 拦截一个调用,这样我就可以做一些日志记录,然后执行原始调用。我看不到用 sinon.spy() 做到这一点的方法,但我想我可以用 sinon.stub() 做到这一点。 我
我是SinonJs的初学者,当我尝试编写一些演示代码时,它无法工作,我不知道为什么。 应用程序.js const db = require('./db'); module.exports.si
sinon-mongoose = 2.3.0不适用于 sinon 9我的代码如下 // test.js const sinon = require('sinon'); require('sinon-m
我正在尝试创建一个单元测试来测试我的代码创建的对象是否已成功发送到更新函数(当前不测试更新函数,因为这将是集成测试)。 我想做的是使用 sinon 模拟来检查更新方法的输入是否正确: var obje
当使用 sinon 时,我只想替换函数的返回值,不需要其他信息,例如调用了多少次。哪一个更好? sinon.replace(Component.prototype, 'getValue', () =>
我在获取一个 sinon stub 来返回/解析另一个 sinon stub 时遇到问题。我正在使用 sinon、chai、chai-as-promised 和 mocha。 我正在按顺序执行多个异步
在我们的前端单元测试中使用 sinon 和 sinon-qunit,我很难理解这些方法的区别。我们正在使用 sinon.sandbox.stub()(字面意思是函数,我们不创建沙箱)并且这些 stub
我正在尝试调用 fail我的片段中的条件。 但是当我使用 sinon.stub().throws()方法它显示我错误。 我无法在代码中处理它。 这是我的片段: login() { let lo
我有一个中间件功能,它检查 session token 以查看用户是否是管理员用户。如果所有检查都通过,该函数不会返回任何内容,而只是调用 next()。 在对 Sinon spy 的 next()
我想在node.js和mocha上使用sinon。我在测试文件中执行以下操作: var sinon = require('sinon') 之后 sinon var 是空对象。 global.sinon
在下面的单元测试代码中: TestModel = Backbone.Model.extend({ defaults: { 'selection': null },
当我在对象内部的函数上使用 Sinon 时,它可以工作: function myFunc() { console.log('hello'); } var myObj = { myFunc: m
假设我想通过添加我自己的特殊 stub 来扩展 sinon:我可以这样写: sinon.specialStub = function() { return this.stub().return
我有一个函数需要使用 sinon 进行测试。它需要两个参数并具有可以引发的不同事件。我正在尝试模拟“准备就绪”事件,以模拟成功的 SFTP 连接 function configureSFTPConne
我有一个非常简单的 JS 库(称为 trysinon.js),如下所示: export function foo() { bar(); } export function bar() { ret
我们正在使用Sinon.JS对于一些集成测试,我遇到了一个问题,我需要以某种方式进行调试。我们使用 fakeServer.create() 方法,如下所示: server = Sinon.fakeSe
我发现了几个相关的问题,但似乎没有一个对我想要实现的内容有帮助。 因此,我想监视构造函数方法,以便当使用构造函数创建的对象在不同范围另一个函数中调用此方法时,我可以知道该调用所使用的参数制作。 示例:
我正在尝试为这个简单的中间件功能编写一个独立的测试 function onlyInternal (req, res, next) { if (!ReqHelpers.isInternal(req)
我觉得我大致了解 sinon 的工作原理,但在监视传递给我正在测试的导入函数的回调时遇到了一些麻烦。这是一个例子: import sinon from 'sinon' const callbackCa
我是一名优秀的程序员,十分优秀!