12

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

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

教科书使用了alert()方法,但是这样比较麻烦,不知道怎么测试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
});

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

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

    console.log(person.name);    //Nicholas
    console.log(person.age);     //29
});

Jasmine 测试看起来像:

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

有没有一种我只是想念的简单方法来做到这一点?我对编码很陌生,所以任何指导都将不胜感激。

4

2 回答 2

25

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

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

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

  return person;
};

使用上面的函数,有几种方法可以测试它。一种是使用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);
});

另一个是测试函数的实际输出。

it("should return a person", function () {
    var person = function_to_test();
    expect(person).toEqual({ name : "Nicholas", age : 29 });
});
于 2013-11-12T21:17:03.753 回答
0

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

spyOn(console, 'error');
const dto = new DTO();  // add to console.error if no parameter is given
expect(console.error).toHaveBeenCalled();
于 2021-02-11T18:23:54.883 回答