我正在尝试测试coffeescript类,我遇到了ajax调用问题。例如,在咖啡中,我使用$ .getJSON从服务器获取一些数据。如何在测试中捕获此请求或重定向到某个虚假服务器?我已经读过有关sinon fakeServer的一些内容,我试过这样的事情:
describe "TestClass", ->
describe "#run", ->
beforeEach ->
url = "/someUrl'
@server = sinon.fakeServer.create()
$ =>
@server.respondWith("GET", url,
[200, {"Content-Type": "application/json"},
'{}'])
@entriesDownloader = new TestClass().run()
但它不起作用。在方法运行中,我使用jquery调用API。如何捕获此请求并返回一些模拟。谢谢你的所有答案。
答案 0 :(得分:2)
您可以在不需要虚假服务器的情况下存根$.getJSON
方法。例如:
sinon.stub($, 'getJSON').yields({ prop: 'val' });
或者,如果您想仅存储某些网址的行为:
sinon.stub($, 'getJSON').withArgs('/someUrl').yields({ prop: 'val' });
可以使用$.getJSON.restore()
答案 1 :(得分:0)
在我看来你错过了回调间谍。而你似乎没有运行任何测试,只有beforeEach
。这是文档中的示例,它遵循AAA的典型模式:Arrange,Act,Assert:
server = undefined
before ->
server = sinon.fakeServer.create()
after ->
server.restore()
it "calls callback with deserialized data", ->
callback = sinon.spy()
getTodos 42, callback
server.requests[0].respond 200,
"Content-Type": "application/json"
, JSON.stringify([
id: 1
text: "Provide examples"
done: true
])
assert callback.calledOnce
那assert callback.calledOnce
非常重要。另一个方便的功能是calledWith
,如下所示:callback.calledWith(1, 2, 3)
。当您将一组已知参数传递给测试函数时,使用该代码确保您的代码将正确的参数传递给外部函数。