【问题标题】:Jasmine: can't test function being passed as parameterJasmine:无法测试作为参数传递的函数
【发布时间】:2020-03-20 16:35:03
【问题描述】:

这是我的 js 文件:

My.File = {
    someMethod: function() {
        var finalURL = "https://some.url.com"
        var somePostCall = $.post(My.URL, {
            sessionToken: My.Session.sessionToken
        });
        somePostCall.done(function(response) {
            //do something with the response   ===> I want to test this function, and mock the 'response'

        });
    }
}

我要做的是编写一个测试,涵盖在“完成”调用中传递的函数。我不想进行实际的 ajax 调用,我想从 http 调用中获取响应,并且仍然希望 somePostCall 承诺被调用。而当“完成”方法时,“响应”必须用我编造的东西来嘲笑。

我一直在尝试捕获来自 $.post 调用的响应。像这样:

spyOn($, 'post').and.callThrough();
My.File.someMethod();
var promise = $.post.calls.mostRecent().args[0];

问题是 .args[0] 没有从 $.post 返回值,它只是传递的参数。如果我可以监视来自 $.post 的响应,那么我可以监视它,并捕获传递给“完成”方法的函数。这样我至少可以手动调用它,并传递一个模拟的“响应”。

有什么想法吗?

【问题讨论】:

    标签: javascript testing jasmine karma-jasmine karma-runner


    【解决方案1】:

    .args[0] 不返回已解决的承诺。它只是检查传递给函数的参数。而且它也是异步的。所以你的期望需要等待,直到承诺得到解决。

    My.File = {
        someMethod: function() {
            var finalURL = "https://some.url.com"
            return $.post(finalURL, { // return the promise
                sessionToken: My.Session.sessionToken
            });
        }
    }
    

    规范文件。

    it('some spec', async () => { // Async
      spyOn($, 'post').and.callThrough();
      const response = await My.File.someMethod();
    
      // check if post method is called with correct arguments e.g My.URL is what you expect
      const url = $.post.calls.mostRecent().args[0]
      expect(url).to.be("https://some.url.com");
    
      // test the response 
    });
    

    【讨论】:

    • 感谢和抱歉耽搁了。不幸的是,我不能分享确切的代码,因为它属于一个组织,我不允许分享它。我发布了一个类似的版本,好吧,你的回答并不能解决我的问题。基本上,获取指向匿名函数的指针的唯一方法是执行真正的逻辑,然后获取参数(即指向匿名函数的指针)。然后,我可以手动执行指针,并将我想要的任何参数传递给它。
    • 我不明白你对指针和匿名函数的解释。在您提供的规范文件中,您正在调用承诺。您不会等到问题解决后再进行测试。所以你需要等到promise被解决。
    • 对,但是匿名函数里面有代码。有逻辑。分支,条件等。所有这些都由来自承诺的“响应”驱动。如何模拟“响应”?
    • 如果你想模拟,那么你需要参考测试框架工作文档。如果你正在使用它会像spyOn($, 'post').and.returnValue(mockResponse);
    最近更新 更多