我正在使用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发出请求。
答案 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
?然后你需要改变语法。