Added expect().withContext() to provide additional information in failure messages

This commit is contained in:
Steve Gravrock
2018-05-14 21:18:55 -07:00
parent 282c436463
commit e2897ce619
2 changed files with 116 additions and 9 deletions

View File

@@ -488,5 +488,88 @@ describe("Expectation", function() {
error: customError
});
});
describe("#withContext", function() {
it("prepends the context to the generated failure message", function() {
var matchers = {
toFoo: function() {
return {
compare: function() { return { pass: false }; }
};
}
},
util = {
buildFailureMessage: function() { return "failure message"; }
},
addExpectationResult = jasmine.createSpy("addExpectationResult"),
expectation = jasmineUnderTest.Expectation.Factory({
customMatchers: matchers,
util: util,
actual: "an actual",
addExpectationResult: addExpectationResult
});
expectation.withContext("Some context").toFoo("hello");
expect(addExpectationResult).toHaveBeenCalledWith(false,
jasmine.objectContaining({
message: "Some context: failure message"
})
);
});
it("prepends the context to a custom failure message", function() {
var matchers = {
toFoo: function() {
return {
compare: function() { return { pass: false, message: "msg" }; }
};
}
},
addExpectationResult = jasmine.createSpy("addExpectationResult"),
expectation = jasmineUnderTest.Expectation.Factory({
customMatchers: matchers,
actual: "an actual",
addExpectationResult: addExpectationResult
});
expectation.withContext("Some context").toFoo("hello");
expect(addExpectationResult).toHaveBeenCalledWith(false,
jasmine.objectContaining({
message: "Some context: msg"
})
);
});
it("prepends the context to a custom failure message from a function", function() {
var matchers = {
toFoo: function() {
return {
compare: function() {
return {
pass: false,
message: function() { return "msg"; }
};
}
};
}
},
addExpectationResult = jasmine.createSpy("addExpectationResult"),
expectation = jasmineUnderTest.Expectation.Factory({
customMatchers: matchers,
actual: "an actual",
addExpectationResult: addExpectationResult
});
expectation.withContext("Some context").toFoo("hello");
expect(addExpectationResult).toHaveBeenCalledWith(false,
jasmine.objectContaining({
message: "Some context: msg"
})
);
});
});
});

View File

@@ -62,19 +62,27 @@ getJasmineRequireObj().Expectation = function(j$) {
};
Expectation.prototype.buildMessage = function(result, name, args) {
var util = this.util;
if (result.pass) {
return '';
} else if (this.filter && this.filter.buildFailureMessage) {
return this.filter.buildFailureMessage(result, name, args, this.util);
} else if (!result.message) {
args = args.slice();
args.unshift(false);
args.unshift(name);
return this.util.buildFailureMessage.apply(null, args);
} else if (j$.isFunction_(result.message)) {
return result.message();
return this.filter.buildFailureMessage(result, name, args, util, defaultMessage);
} else {
return result.message;
return defaultMessage();
}
function defaultMessage() {
if (!result.message) {
args = args.slice();
args.unshift(false);
args.unshift(name);
return util.buildFailureMessage.apply(null, args);
} else if (j$.isFunction_(result.message)) {
return result.message();
} else {
return result.message;
}
}
};
@@ -91,9 +99,16 @@ getJasmineRequireObj().Expectation = function(j$) {
expect.not = Object.create(expect);
expect.not.filter = negatingFilter;
expect.withContext = function(message) {
var filteredExpect = Object.create(expect);
filteredExpect.filter = new ContextAddingFilter(message);
return filteredExpect;
};
return expect;
};
var negatingFilter = {
selectComparisonFunc: function(matcher) {
function defaultNegativeCompare() {
@@ -120,5 +135,14 @@ getJasmineRequireObj().Expectation = function(j$) {
}
};
function ContextAddingFilter(message) {
this.message = message;
}
ContextAddingFilter.prototype.buildFailureMessage = function(result, matcherName, args, util, getDefaultMessage) {
return this.message + ': ' + getDefaultMessage();
};
return Expectation;
};