【问题标题】:Is it possible to use Jasmine's toHaveBeenCalledWith matcher with a regular expression?是否可以将 Jasmine 的 toHaveBeenCalledWith 匹配器与正则表达式一起使用?
【发布时间】:2013-02-12 20:22:15
【问题描述】:

我查看了 Jasmine 的 toHaveBeenCalledWith 匹配器文档,以了解是否可以为参数传入正则表达式(如果该参数预期为字符串)。不幸的是,这是不受支持的功能。还有一个issue open on github 请求此功能。

我已经深入研究了代码库,我看到了如何在existing matcher 中实现它。我认为将其实现为单独的匹配器会更合适,以便单独捕获抽象。

与此同时,什么是好的解决方法?

【问题讨论】:

    标签: jasmine


    【解决方案1】:

    经过一番挖掘,我发现Jasmine spy 对象有一个calls 属性,而该属性又具有一个mostRecent() 函数。这个函数还有一个子属性args,它返回一个调用参数数组。

    因此,当人们想要检查字符串参数是否匹配特定的正则表达式时,可以使用以下序列对调用参数执行正则表达式匹配:

    var mySpy = jasmine.createSpy('foo');
    mySpy("bar", "baz");
    expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
    expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
    

    非常简单。

    【讨论】:

      【解决方案2】:

      从 Jasmine 2.2 开始,您可以使用jasmine.stringMatching

      var mySpy = jasmine.createSpy('foo');
      mySpy('bar', 'baz');
      expect(mySpy).toHaveBeenCalledWith(
        jasmine.stringMatching(/bar/),
        jasmine.stringMatching(/baz/)
      );
      

      【讨论】:

      • 如果您使用的是最新的 Jasmine,这应该是公认的解决方案。我在尝试使用 .argsForCall.args 时收到错误
      • 这就是为什么我的默认答案视图是“活跃”而不是“投票”的原因。
      【解决方案3】:

      在 Jasmine 2.0 中,signature changed a bit。应该是这样的:

      var mySpy = jasmine.createSpy('foo');
      mySpy("bar", "baz");
      expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
      expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
      

      Documentation for Jasmine 1.3 已经移动了。

      【讨论】:

        【解决方案4】:

        或者,如果您正在监视对象上的方法:

        spyOn(obj, 'method');
        obj.method('bar', 'baz');
        expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
        expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
        

        【讨论】:

        • 在 Jasmine 2.0 中,语法是 obj.method.calls.argsFor(index),仍然是一个数组。
        • 如果你在 Angular (2+) 中尝试这个,打字稿似乎不喜欢它,所以你可能不得不使用括号符号 obj.method['calls']['argsFor'](index) 来绕过类型检查
        【解决方案5】:

        有时这样写更易读:

        spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
            expect(arg1).toMatch(/bar/);
            expect(arg2).toMatch(/baz/);
        });
        obj.method('bar', 'baz');
        expect(obj.method).toHaveBeenCalled();
        

        它使方法参数更清晰可见(而不是使用数组)

        【讨论】:

          【解决方案6】:

          正如 jammon 所说,Jasmine 2.0 签名已更改。如果您在 Jasmine 2.0 中监视对象的方法,则应将 Nick 的解决方案更改为使用类似 -

          spyOn(obj, 'method');
          obj.method('bar', 'baz');
          expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/);
          expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-11
            • 2023-03-14
            • 2010-10-24
            • 1970-01-01
            • 1970-01-01
            • 2021-04-02
            相关资源
            最近更新 更多