Reputation: 6772
I'm working through the text: Professional JavaScript for Web Developers by Nicholas Zakas and I'm testing the examples with Jasmine.js.
I can currently test the output of a function by specifying a return a value, but I'm running into trouble when there are multiple pieces of data that I want to return.
The textbook uses the alert() method, but this is cumbersome and I don't know how to test for alerts. I was wondering if there was a way to test for console.log() output. For instance:
function_to_test = function(){
var person = new Object();
person.name = "Nicholas";
person.age = 29;
return(person.name); //Nicholas
return(person.age); //29
});
I know I can have them return as one string, but for more complicated examples I'd like to be able to test the following:
function_to_test = function(){
var person = new Object();
person.name = "Nicholas";
person.age = 29;
console.log(person.name); //Nicholas
console.log(person.age); //29
});
The Jasmine test looks something like:
it("should test for the function_to_test's console output", function(){
expect(function_to_test()).toEqual("console_output_Im_testing_for");
});
Is there a simple way to do this that I'm just missing? I'm pretty new to coding so any guidance would be appreciated.
Upvotes: 13
Views: 32211
Reputation: 39
Please try this,
function_to_test = function(){
var person = new Object()
person.name = "Nicholas"
person.age = 29
console.log(person.name) //Nicholas
console.log(person.age) //29
});
describe('test',()=>{
it("should test for the function_to_test's console output", ()=>{
const logSpy = spyOn(console, 'log')
function_to_test ()
expect(logSpy.calls.count()).toBe(2) // "console.log" called twice
expect(logSpy.calls.all()[0].args[0]).toBe("Nicholas")
expect(logSpy.calls.all()[1].args[0]).toBe(29)
})
})
Hope it helps,
thanks
Upvotes: 0
Reputation: 808
I know this is an old question (7+ years old) but I just came upon this answer today through Google search. From this answer, I changed it to the following and has worked for me.
spyOn(console, 'error');
const dto = new DTO(); // add to console.error if no parameter is given
expect(console.error).toHaveBeenCalled();
Upvotes: 6
Reputation: 1969
There are a couple of things that are wrong with your code above. As pointed out, having multiple return statement will not work. Also, when defining a new object, it is preferable to use the object literal syntax over using new Object
.
What you would normally do is something more like this:
var function_to_test = function () {
var person = {
name : "Nicholas",
age : 29
};
return person;
};
Using the function above, there are a couple of ways you could test this. One it to mock out the console.log object using Jasmine Spies.
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);
});
The other is to test the actual output of the function.
it("should return a person", function () {
var person = function_to_test();
expect(person).toEqual({ name : "Nicholas", age : 29 });
});
Upvotes: 27