【问题标题】:Jasmine: How to test a controller function calling other javascript functionJasmine:如何测试调用其他 javascript 函数的控制器函数
【发布时间】:2014-11-20 05:48:43
【问题描述】:

这里是示例代码:

App.controller('Crtl', ["$scope", function ($scope) {

$scope.FetchDetail = function () {
    var accNum = this.customer.accNo;
    GetAccountDetails(accNum);
}; }]);

我是 Jasmine 的新手,现在我正在为我的 Angular 代码编写单元测试。在这里,我创建了 FetchDetail 函数,然后调用 javascript 函数 GetAccountDetails(accNum)。

如何使用 Jasmine 测试此示例。

【问题讨论】:

  • GetAccountDetails() 在哪里定义?注射了吗?
  • 在另一个 Javascript 文件中定义。
  • 所以它是一个全球性的?你最好注入它然后你可以存根它,但你可以在它上面放置一个间谍。我将其添加为答案。

标签: angularjs jasmine


【解决方案1】:

这取决于您是否需要存根(即捕获并更改其行为)或是否足以监视它(观察它)。无论哪种方式,你最好注入它,这样你就可以控制它。

我一直很开心地使用 sinon http://sinonjs.org

如果你想窥探它,即观察它的行为而不改变它,那么在调用它之前,你会做

var spy = sinon.spy(GetAccountDetails);

然后你可以检查它是否被调用,或者是什么参数等等。

spy.calledOnce === true; // if it was called once
spy.called === true; // if it was called at all
spy.firstCall.args[0]; // first argument to first call
// etc. - check out the docs

如果您需要存根,请使用存根功能,然后您可以在其中定义应该的行为。您可以获得所有间谍功能,还可以控制响应内容。但是,与现有对象的方法相比,很难窥探全局。

【讨论】:

  • 这有帮助。非常感谢。
  • 很高兴。如果您对此感到困惑,请发布另一个q。仅供参考,重要的轨道是spy.reset(),它会重置呼叫计数。我在beforeEach() 中使用它,以便每次调用我都确切知道应该有多少调用以及哪些参数。
  • @deitch GetAccountDetails 应该在作用域上定义吗?我在同一控制器的this 上定义了它,Karma 给出了ReferenceError: GetAccountDetails is not defined 错误!!请提出建议。
  • @Dravidian 不确定。如果它是在this 上定义的,那么 OP 的示例将无法工作,因为它需要是this.GetAccountDetails()。一般来说,我尽可能地避免使用全局变量(还有一点点),并尝试尽可能地发挥作用(当我可以侥幸逃脱时,不要使用 this)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多