2

我正在使用 Jasmine 框架创建一些 Javascript 测试。我正在尝试使用该spyOn()方法来确保已调用特定函数。这是我的代码

    describe("Match a regular expression", function() {
    var text = "sometext"; //not important text; irrelevant value

    beforeEach(function () {
        spyOn(text, "match");
        IsNumber(text);
    });

    it("should verify that text.match have been called", function () {
        expect(text.match).toHaveBeenCalled();
    });
});

但我得到一个

期待一个间谍,但得到了功能

错误。我试图删除该spyOn(text, "match");行,它给出了同样的错误,似乎该功能spyOn()不起作用是应该的。任何想法?

4

2 回答 2

1

我发现为了测试类似 string.match 或 string.replace 的东西,你不需要间谍,而是声明包含你正在匹配或替换的文本并在 beforeEach 中调用函数,然后检查响应等于您所期望的。这是一个简单的例子:

describe('replacement', function(){
    var text;
    beforeEach(function(){
        text = 'Some message with a newline \n or carriage return \r';
        text.replace(/(?:\\[rn])+/g, ' ');
        text.replace(/\s\s+/g, ' ');
    });
    it('should replace instances of \n and \r with spaces', function(){
        expect(text).toEqual('Some message with a newline or carriage return ');
    });
});

这将是成功的。考虑到这种情况,我还将跟进替换以将多个间距减少到单个间距。此外,在这种情况下,这beforeEach不是必需的,因为您可以在it语句中并在您的期望之前使用赋值和调用您的函数。如果您翻转它以string.match阅读更像expect(string.match(/someRegEx/).toBeGreaterThan(0);.

希望这可以帮助。

-C§

编辑:或者,您可以将您的str.replace(/regex/);或压缩str.match(/regex/);到一个被调用的函数中并在spyOn其中使用并spyOn(class, 'function').and.callthrough();在您的beforeEach和使用类似expect(class.function).toHaveBeenCalled();and var result = class.function(someString);(而不仅仅是调用该函数)将允许您测试返回值以expect(class.function(someString)).toEqual(modifiedString);进行替换或expect(class.function(someString)).toBeGreaterThan(0);为比赛。

如果这提供了更深入的了解,请随时 +1。

谢谢,

于 2015-08-24T17:00:17.983 回答
0

您收到该错误是因为它在expect方法上失败。expect方法期望传递一个间谍,但事实并非如此。要解决此问题,请执行以下操作:

var text = new String("sometext");

您的测试用例仍然会失败,因为您没有在任何地方调用 match 方法。如果你想让它通过,那么你需要在it函数内部调用 text.match(/WHATEVER REGEX/) 。

于 2015-03-31T11:36:46.240 回答