我正在使用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()不能正常工作,应该这样做。
任何想法?

最佳答案

我发现为了测试像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操作类似地工作。

希望这可以帮助。

-C§

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

如果可以提供更多的见解,请随时+1。

谢谢,

关于javascript - spyOn:应该是 spy ,但要有功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29367030/

10-13 01:30