如何使用jasmine.js测试控制台输出?

Joe*_*ick 10 javascript console jasmine

我正在处理文本:Nicholas Zakas为Web开发人员提供的专业JavaScript ,我正在使用Jasmine.js测试这些示例.

我当前可以通过指定返回值来测试函数的输出,但是当我想要返回多个数据时,我遇到了麻烦.

教科书使用alert()方法,但这很麻烦,我不知道如何测试警报.我想知道是否有办法测试console.log()输出.例如:

function_to_test = function(){
    var person = new Object();
    person.name = "Nicholas";
    person.age = 29;

    return(person.name);    //Nicholas
    return(person.age);     //29
});
Run Code Online (Sandbox Code Playgroud)

我知道我可以将它们作为一个字符串返回,但是对于更复杂的示例,我希望能够测试以下内容:

function_to_test = function(){
    var person = new Object();
    person.name = "Nicholas";
    person.age = 29;

    console.log(person.name);    //Nicholas
    console.log(person.age);     //29
});
Run Code Online (Sandbox Code Playgroud)

Jasmine测试看起来像:

it("should test for the function_to_test's console output", function(){
    expect(function_to_test()).toEqual("console_output_Im_testing_for");
});
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以做到这一点,我只是错过了?我对编码很新,所以任何指导都会受到赞赏.

小智 22

上面的代码有几个问题.正如所指出的那样,拥有多个return语句将不起作用.此外,在定义新对象时,最好使用对象文字语法而不是使用new Object.

你通常会做的更像是这样的事情:

var function_to_test = function () {
  var person = {
    name : "Nicholas",
    age : 29
  };

  return person;
};
Run Code Online (Sandbox Code Playgroud)

使用上面的函数,有几种方法可以测试它.一个是使用Jasmine Spies模拟console.log对象.

it("should test for the function_to_test's console output", function () {
    console.log = jasmine.createSpy("log");
    var person = function_to_test();
    expect(console.log).toHaveBeenCalledWith(person);
});
Run Code Online (Sandbox Code Playgroud)

另一种是测试函数的实际输出.

it("should return a person", function () {
    var person = function_to_test();
    expect(person).toEqual({ name : "Nicholas", age : 29 });
});
Run Code Online (Sandbox Code Playgroud)

  • @Gagan:抱歉回复晚了。我的测试文件顶部附近有 `let originalLogFunc`。`beforeEach`:`beforeEach(function () { originalLogFunc = console.log; console.log = jasmine.createSpy('log') })`。`afterEach` 是相反的:`afterEach(function () { console.log = originalLogFunc; originalLogFunc = undefined })`。 (2认同)

Esa*_*ith 5

我知道这是一个老问题(7年多了),但我今天刚刚通过谷歌搜索找到了这个答案。从这个答案,我将其更改为以下内容并为我工作。

spyOn(console, 'error');
const dto = new DTO();  // add to console.error if no parameter is given
expect(console.error).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)