首页 文章

如何使用Angular 2组件模拟JQuery Ajax调用

提问于
浏览
0

我们正在开发一个有角度的2应用程序 . 对于单元测试,我们使用Jasmine作为我们的框架 . 我正在尝试为此设置编写我的第一个单元测试 . 我们有一个组件,它使用$ .ajax调用调用Web服务并接收JSON数据 . 代码如下 -

$.ajax({ url:(myurl), 
dataType: 'json', 
success:(returnedData) => {return myData;},
error:(returnedData) => {<log error>;
return}});

返回的数据格式如下 -

{
               "MyClass": {
                   "searchFilter": "test",
                   "additionalIdeas": "moretest",
                   "results": [
                        ["resA", "result A"],
                        ["resB", "result B"],
                        ["resC", "result C"]
                    ]

               },
               "DataFormat": 1
           };

在我的单元测试中,我使用testComponentBuilder注入组件和服务,然后尝试调用该方法,该方法又调用服务来填充我的数据 .

我怎么能在这里模拟json数据?我试着看Jasmine-Ajax,但在注入和测试构建器之间迷路了 .

2 回答

  • 0

    通常,单元测试不应该尝试调用外部源 . 我建议你启动一个 Spy ,它不允许调用出去并声明它与调用你的代码片段的参数一起被调用,你甚至可以模拟一个响应 .

    至于嘲笑JSON,这里的问题是什么?只需创建一个本地模拟资源作为JSON对象,它与ajax调用返回的对象类似或相同 .

    具体来说,您为方法名称创建一个 Spy ,该方法名称用于调用ajax,并使用模拟对象存根响应 . 你甚至可以为你的jQuery ajax调用添加一个 Spy ,假设你正在使用jQuery,例如......

    spyOn($, 'ajax').and.returnValue(yourMockedJsonObject);
    

    http://jasmine.github.io/2.0/introduction.html#section-Spies

  • 1

    我能够使用Deferred对象来完成它 . 代码看起来像 .

    spyOn($,'ajax').and.callFake(()=>{
        var d = $.deferred();
        d.resolve(myMockedJSON);
        d.promise();
    });
    

相关问题