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

时间:2015-03-31 10:57:33

标签: javascript jasmine spyon

我正在使用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()无法正常工作。 有什么想法?

2 个答案:

答案 0 :(得分: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并在{{1}中使用spyOn(class, 'function').and.callthrough();使用beforeEachexpect(class.function).toHaveBeenCalled();之类的东西(而不是仅仅调用函数)将允许您使用var result = class.function(someString);替换为expect(class.function(someString)).toEqual(modifiedString);或使用expect(class.function(someString)).toBeGreaterThan(0);来测试返回值匹配。

如果这有更深入的了解,请随意+1。

谢谢,

答案 1 :(得分:0)

您收到该错误是因为expect方法失败了。 expect方法期望传递间谍,但不是。要解决此问题,请执行以下操作:

var text = new String("sometext");

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