spyOn 无法在 Iron 路由器操作(服务器集成)中使用 js 方法
spyOn not working with js methods inside iron router action (Server Integration)
我正在尝试为 twilio 应用程序编写测试。我的策略是向我的服务器发出一个 http 请求,就像 twilio 在收到对我的一个号码的 phone 调用时所做的那样,然后分析从服务器响应中检索到的 xml。
我试图存根 Meteor.users.find。但是,我没有成功。对 Meteor.users.find 的调用来自路由操作。我想也许 spyOn 和路由操作中的函数有问题。
所以,要在问题上多排查。我决定让问题更简单。这是代码:
在 /server/routes.js
ExpertTest = {
foo: function () {
console.log("called");
return 4;
}
};
allo = function () {
var res = ExpertTest.foo();
console.log(res);
};
Router.route('/call-api/intro', {
where: "server",
name: "Intro",
action: function () {
ExpertTest.foo();
this.response.writeHead(200, {'Content-Type': 'application/xml; charset=utf-8'});
this.response.end();
}
});
并在 tests/jasmine/server/integration/IVRSpec.js
describe("With our IVR", function () {
it("green test", function () {
spyOn(ExpertTest, "foo").and.returnValue(50);
allo();
expect(ExpertTest.foo).toHaveBeenCalled();
});
it('red test', function() {
spyOn(ExpertTest, "foo").and.returnValue(50);
var callFirstResult = HTTP.get(baseUrl + '/call-api/intro');
expect(ExpertTest.foo).toHaveBeenCalled();
});
});
这是控制台中的错误:
jasmine-server-integration: 1 tests failed
With our IVR red test
Expected spy foo to have been called.
meteor://app/tests/jasmine/server/integration/IVRSpec.js:81:32: Expected spy foo to have been called.
我创建了一个 C9 工作区。你可以检查它 here.
我还创建了一个 git repo 来重现该问题。
我是不是做错了什么?
谁能帮帮我?
非常感谢
最后,@sanjo 给了我正确的解决方案。问题出在 baseUrl
变量上。实际上,baseUrl = "http://localhost:3000"
需要指向镜像url。所以解决方案是使用:
var callFirstResult = HTTP.get(Meteor.absoluteUrl('firstRoute'));
或
var callFirstResult = HTTP.get(process.env.ROOT_URL + 'secondRoute');
我正在尝试为 twilio 应用程序编写测试。我的策略是向我的服务器发出一个 http 请求,就像 twilio 在收到对我的一个号码的 phone 调用时所做的那样,然后分析从服务器响应中检索到的 xml。
我试图存根 Meteor.users.find。但是,我没有成功。对 Meteor.users.find 的调用来自路由操作。我想也许 spyOn 和路由操作中的函数有问题。
所以,要在问题上多排查。我决定让问题更简单。这是代码:
在 /server/routes.js
ExpertTest = {
foo: function () {
console.log("called");
return 4;
}
};
allo = function () {
var res = ExpertTest.foo();
console.log(res);
};
Router.route('/call-api/intro', {
where: "server",
name: "Intro",
action: function () {
ExpertTest.foo();
this.response.writeHead(200, {'Content-Type': 'application/xml; charset=utf-8'});
this.response.end();
}
});
并在 tests/jasmine/server/integration/IVRSpec.js
describe("With our IVR", function () {
it("green test", function () {
spyOn(ExpertTest, "foo").and.returnValue(50);
allo();
expect(ExpertTest.foo).toHaveBeenCalled();
});
it('red test', function() {
spyOn(ExpertTest, "foo").and.returnValue(50);
var callFirstResult = HTTP.get(baseUrl + '/call-api/intro');
expect(ExpertTest.foo).toHaveBeenCalled();
});
});
这是控制台中的错误:
jasmine-server-integration: 1 tests failed
With our IVR red test
Expected spy foo to have been called.
meteor://app/tests/jasmine/server/integration/IVRSpec.js:81:32: Expected spy foo to have been called.
我创建了一个 C9 工作区。你可以检查它 here.
我还创建了一个 git repo 来重现该问题。
我是不是做错了什么?
谁能帮帮我?
非常感谢
最后,@sanjo 给了我正确的解决方案。问题出在 baseUrl
变量上。实际上,baseUrl = "http://localhost:3000"
需要指向镜像url。所以解决方案是使用:
var callFirstResult = HTTP.get(Meteor.absoluteUrl('firstRoute'));
或
var callFirstResult = HTTP.get(process.env.ROOT_URL + 'secondRoute');