首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候在单元测试期间监视方法是有用的?

什么时候在单元测试期间监视方法是有用的?
EN

Stack Overflow用户
提问于 2015-04-13 06:25:05
回答 2查看 69关注 0票数 0

使用Jasmine可以对方法执行spyOn操作,但我不清楚它什么时候会真正有用。我的理解是,单元测试不应该关注实现细节,如果方法被调用,则测试将是实现细节。

我可能想到的一个地方是监视scope.$broadcast (Angular)等,但这仍然是实现细节,不确定单元测试是否应该关心代码是如何工作的,只要它能给出预期的结果。

显然,使用spyOn有很好的理由,那么在什么地方使用它更好呢?

EN

回答 2

Stack Overflow用户

发布于 2015-04-13 17:17:17

您描述的spyOn在测试中通常被称为模拟,尽管更清楚地说,它允许两个操作:

通过mock)

  • Instrument为一个方法创建一个新的实现(这是通过spyOn的经典方法

(这允许您查看该方法是否被调用,以及使用了什么参数、返回值等)spyOn

Mocking可能是单元测试中使用最多的技术。当你测试一个代码单元时,你经常会发现有对其他代码单元的依赖关系,而这些依赖关系有它们自己的依赖关系等等。如果你试图测试所有的东西,你最终会得到一个模块/ UI测试,这是昂贵和难以维护的(它们仍然很有价值,但你想要尽可能少的模块/UI测试)

这就是mocking的用武之地。想象一下,您的单元调用REST服务来获取一些数据。您不希望在单元测试中依赖于服务。因此,您可以模拟调用服务的方法,并提供您自己的简单返回一些数据的实现。想要检查您的单元是否处理了REST错误?让mock返回一个错误。等。

有时知道你的代码是否真的调用了另一个代码单元是很有用的-假设你想要确保你的代码正确地调用了一个日志记录模块。只需模拟(spyOn)日志记录模块,并使用适当参数断言它被调用了X次。

票数 0
EN

Stack Overflow用户

发布于 2015-04-17 12:28:28

您可以侦察函数,然后您将能够断言有关它的一些事情。您可以检查它是否被调用,它有哪些参数,如果

返回一些东西,甚至是它被调用了多少次!间谍在编写测试时非常有用,所以我将在这里解释如何使用最常见的间谍。

代码语言:javascript
复制
        // This is our SUT (Subject under test)
        function Post(rest) {
          this.rest = rest; 
         rest.init();
        }

我们这里有我们的SUT,它是一个Post构造函数。它使用RestService来获取它的东西。我们的Post将把所有的Rest工作委托给RestService,当我们创建一个新的Post对象时,它将被初始化。让我们开始一步一步地测试它:

代码语言:javascript
复制
    `describe('Posts', function() {
      var rest, post;
      beforeEach(function() {
        rest = new RestService();
        post = new Post(rest);
      });
    });`

这里没有什么新鲜事。因为我们在每次测试中都需要这两个实例,所以我们将初始化放在一个beforeEach上,这样每次都会有一个新实例。在创建帖子时,我们初始化RestService。我们想要测试一下,我们该怎么做呢?

代码语言:javascript
复制
    `it('will initialize the rest service upon creation', function() {
      spyOn(rest, 'init');
      post = new Post(rest);
      expect(rest.init).toHaveBeenCalled();
    });`

当我们创建一个新的Post对象时,我们想要确保在rest上调用init。为此,我们使用jasmine spyOn函数。第一个参数是我们想要放置间谍的对象,第二个参数是一个字符串,它表示要间谍的函数。在本例中,我们希望侦察间谍对象上的函数init。然后我们只需要创建一个新的Post对象,该对象将调用该init函数。最后一部分是断言已经调用了rest.init。很简单,对吧?这里很重要的一点是,当你窥探一个函数时,真正的函数永远不会被调用。所以在这里rest.init实际上并没有运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29595360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档