Javascript 检查是否在测试模式下调用了函数

Javascript 检查是否在测试模式下调用了函数,javascript,Javascript,我有一个javascript代码,可以发出get请求。它很好用 export const getReq=()=>{ 取回( 'https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits', ) 。然后((响应)=>{ 让status=null; 如果(response.status==200){ 状态=响应。状态; }否则{ 状态='错误'; } 如果(状态===200){ 警惕(“成功”); }否则{

我有一个javascript代码,可以发出get请求。它很好用

export const getReq=()=>{
取回(
'https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits',
)
。然后((响应)=>{
让status=null;
如果(response.status==200){
状态=响应。状态;
}否则{
状态='错误';
}
如果(状态===200){
警惕(“成功”);
}否则{
警报(“错误”);
}
返回response.json();
})
。然后((提交)=>{
返回commits.map(({sha})=>sha)[0];
});

};从测试中,不完全清楚您是否知道
getReq
应该做什么。您模拟它*以返回
123
,但假设实现基本正确,它实际上将返回一个字符串数组的承诺,其中每个字符串都是
sha
(实际上它返回undefined,因为您不返回承诺链,并且可能您实际上希望它返回第一次提交的完整
sha
,而不是每次提交的
sha
的第一个字符?)

类似地,在模拟中,for
fetch
没有意义:

global.fetch=jest.fn(()=>{
返回承诺。解决(123);
});
您的代码当然不希望
fetch
返回
123
的承诺,它希望它返回一个带有
status
prop的响应对象的承诺,以及一个带有
sha
prop的
json
方法返回一个对象数组的承诺。您的双倍测试需要具有与t相同的接口他们正在替换的东西,或者他们毫无意义

大体上,我希望该函数的测试如下所示:

从“/getReq”导入{getReq};
它(“工作”,异步()=>{
global.alert=jest.fn();//否则“错误:未实现:window.alert”
global.fetch=jest.fn().mockResolvedValueOnce({
json:()=>Promise.resolve([
/*从https://developer.github.com/v3/repos/commits/#list-提交*/
{sha:“6dcb09b5b57875f334f61aebed695e2e4193db5e”},
{sha:“f103561f390825e76f196ce952a982542861fef3”},
]),
现状:200
});
const result=wait getReq();
期望(global.alert)。获得成功;
expect(global.fetch).tohavencalledwith(
"https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits"
);
期望(结果)。toEqual([“6”,“f”]);//或者可能是“6dcb09b5b57875f334f61aebed695e2e4193db5e”?
});
由于我在上面暗示的原因,这将在最后一次预期中失败

或者,您可以将其分为三个测试:发出正确的请求、发送正确的警报、返回正确的结果。还应该对不满意的路径进行测试,例如,如果请求返回非200(您是否仍然假设
response.json()
在这种情况下就可以了?)

您还可以寻找一种与
fetch
API不那么紧密耦合的测试方法(我们不应该真的去模仿我们不拥有的东西)


*你的测试是模拟的,没有涉及生产代码。不要模拟你应该测试的东西。

@digitaldriver,我使用的是
jest.mock('./getReq',()=>({getReq:()=>123}));
等等,
()=>123
不是模拟的。你需要类似于
getReq:jest.fn().mockReturnValue(123)的东西
@YuryTarabanko,它可以工作,但是如果现在我想测试
expect(sha)。toEqual(123)
,我得到
预期的:123收到:未定义的
。为什么?以及如何解决它?如果你想测试
getReq
调用
fetch
,你需要模拟
fetch
,而不是
getReq
。你将
expect(fetch).tohaveBeenCall()
,而不是
getReq
的结果(正如错误所说,它甚至不是一个函数)。一般来说,不清楚您要测试什么。为什么需要测试模拟的结果。或者您刚才调用的函数实际上已被调用。其他评论员可能是对的,您需要模拟
fetch
not
getReq
,如果您的意思是我需要在获取非200 http代码状态时进行测试n是的,我还需要一个测试来应对这种情况。谢谢advance@Asking是的;您可能应该对以下两个方面进行测试:1.请求成功,但状态为非200(本例中的主体是什么?)和2.请求完全失败。您的意思是,在非200的情况下,除了状态之外,响应中还应该有什么?还有
expect(result).toEqual(“6dcb09b5b57875f334f61aebed695e2e4193db5e”);
,我得到了预期:“6dcb09b5b57875f334f61aebed695e2e4193db5e”Received:Unfined1.是的,如果请求不正常,JSON方法会返回什么?如果它不在文档中,请尝试发出一些请求并找出答案。2.是的,因为您的代码不工作,我在回答中提到了这一点。使用测试帮助您修复它。