如何存根响应HTTP响应的函数?

时间:2018-02-27 01:37:15

标签: javascript node.js express amazon-s3 sinon

我正在使用ExpressJS,并希望将一个响应HTTP响应的函数作为路由器的一部分进行存根。特别是,它是对Amazon S3的一个请求,我正在尝试存根。

public class BlogPostContext
{
    private readonly IMongoDatabase _mongoDatabase;
    private readonly IMongoClient _mongoClient;

    public IMongoCollection<BlogPostModel> BlogPostModelCollection => _mongoDatabase.GetCollection<BlogPostModel>("BlogPostModel");

    public BlogPostContext(IMongoDatabase mongoDatabase, IOptions<MongoDbSettings> settings)
    {
        _mongoDatabase = mongoDatabase;
        _mongoClient = new MongoClient(settings.Value.ConnectionString);
        if (null != _mongoDatabase) _mongoDatabase = _mongoClient.GetDatabase(settings.Value.Database);
    }
} 

我正在尝试使用namespace FloormindCore.Blog.Factory { public interface IContextFactory<out T> where T : new() { T Create(); } } using System; namespace FloormindCore.Blog.Factory { public class ContextFactory<T> : IContextFactory<T> where T : new() { public T Create() { return (T)Activator.CreateInstance(typeof(T)); } } } 存根app.get('/', (req, res, next) => { s3.getSignedUrl('putObject', (err, url) => { res.json({ url: url }); }); };

getSignedUrl

如何正确存根此方法?我不想每次都向S3发出请求。

2 个答案:

答案 0 :(得分:1)

您不需要存根,因为getSignedUrl实际上并未向S3发出请求。

签名URL完全在本地生成...将使用散列消息身份验证代码(HMAC)算法对URL附带的请求的规范版本进行签名,该算法生成服务可以使用的签名,以便稍后验证请求签名是使用有效的凭证创建的(但是这种方法在计算上不可能进行逆向工程。)

您可以通过以下几种方式向自己说明这一点:在循环中为相同的对象和参数生成签名的URL,您会注意到它们实际上只会随着系统时钟每秒向前跳变而改变。将时钟设置为几秒钟,生成的URL的周期将根据 系统时钟的时间以相同的值重复自身。或者,为不存在的对象或存储桶生成签名URL ...生成是本地的,因此不会发生错误。或者制作一个假的access-key-id和secret。您可以全天生成签名网址。如果你试图使用它们,它们实际上不会有效,但它们仍然可以毫无错误地生成。

答案 1 :(得分:0)

你的代码看起来不错。这应该工作:

const sinon = require('sinon');
const s3 = require('s3');
sinon.stub(s3, 'getSignedUrl', params => {
  return Promise.resolve('http://dummy-url.com/signed');
});

const url = s3.getSignedUrl('putObject');
console.log(url);

你在控制台中没有TypeError: stub(obj, 'meth', fn) has been removed, see documentation ?然后你需要改变语法。

http://sinonjs.org/releases/v2.0.0/stubs/