如何向nock.Scope添加扩展功能
我在角度/打字稿服务器端应用程序的单元测试中使用nock。我有一组经常发出的复杂请求,我想将同一组nock请求重用于多个单元测试。我想向nock.Scope添加函数,使我可以像这样设置单元测试:
const req = nock('/')
.mockPermissions(param1, param2)
.get('/unique-request-for-unit-test')
.reply(200, {data: true});
我曾尝试像这样创建一个testHelper.ts文件:
import nock from 'nock';
module 'nock' {
class Scope {
mockPermissions(param1: string, param2: string): Scope;
}
}
nock.Scope.prototype.mockPermissions = function(param1: string, param2: string) {
return this
.get('/permission')
.reply(200, { permission: data })
.get('/group')
.reply(200, { group: data });
};
尽管我的示例尝试编译良好,但在运行时它基本上说找不到nock.Scope。
我该怎么做?
回答如下:这对您不起作用,因为Scope
仅作为类型从库中导出,而作为值的类未公开。您可以看到导出了哪些值here in the index file。
我个人也通常建议不要采用这种方法。修改不完全控制的对象的原型通常被认为是代码气味,因为它可能会导致意想不到的问题。
[以前,当我穿上你的鞋子时,我就走了创建帮助程序功能的方法,这些功能可以预先构建提示。我通常把他们和创建其他工厂的测试助手放在一起。
以您的代码为例,我将创建类似:
export function nockAuthForBaseService(param1: string, param2: string) {
return nock('http://some-base-server/')
.get('/permission')
.reply(200, { permission: param1 })
.get('/group')
.reply(200, { group: param2 });
}
然后,我可以调用并重用该工厂的各种测试,以将其干燥。
如果完全由您决定,是否传递现有的nock实例。我从来没有想过要在所有服务中重用我想要的拦截器的场景,因此让我的代码更好地让助手知道基本URL。只需要少一小部分的测试开销。
如何向nock.Scope添加扩展功能
我在角度/打字稿服务器端应用程序的单元测试中使用nock。我有一组经常发出的复杂请求,我想将同一组nock请求重用于多个单元测试。我想向nock.Scope添加函数,使我可以像这样设置单元测试:
const req = nock('/')
.mockPermissions(param1, param2)
.get('/unique-request-for-unit-test')
.reply(200, {data: true});
我曾尝试像这样创建一个testHelper.ts文件:
import nock from 'nock';
module 'nock' {
class Scope {
mockPermissions(param1: string, param2: string): Scope;
}
}
nock.Scope.prototype.mockPermissions = function(param1: string, param2: string) {
return this
.get('/permission')
.reply(200, { permission: data })
.get('/group')
.reply(200, { group: data });
};
尽管我的示例尝试编译良好,但在运行时它基本上说找不到nock.Scope。
我该怎么做?
回答如下:这对您不起作用,因为Scope
仅作为类型从库中导出,而作为值的类未公开。您可以看到导出了哪些值here in the index file。
我个人也通常建议不要采用这种方法。修改不完全控制的对象的原型通常被认为是代码气味,因为它可能会导致意想不到的问题。
[以前,当我穿上你的鞋子时,我就走了创建帮助程序功能的方法,这些功能可以预先构建提示。我通常把他们和创建其他工厂的测试助手放在一起。
以您的代码为例,我将创建类似:
export function nockAuthForBaseService(param1: string, param2: string) {
return nock('http://some-base-server/')
.get('/permission')
.reply(200, { permission: param1 })
.get('/group')
.reply(200, { group: param2 });
}
然后,我可以调用并重用该工厂的各种测试,以将其干燥。
如果完全由您决定,是否传递现有的nock实例。我从来没有想过要在所有服务中重用我想要的拦截器的场景,因此让我的代码更好地让助手知道基本URL。只需要少一小部分的测试开销。