Allow stubs to match only a particular http method (GET, POST, PUT, etc.)
Fixes #36
This commit is contained in:
parent
b6a0020b84
commit
199324e720
@ -69,8 +69,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
paramParser.reset();
|
||||
};
|
||||
|
||||
this.stubRequest = function(url, data) {
|
||||
var stub = new RequestStub(url, data);
|
||||
this.stubRequest = function(url, data, method) {
|
||||
var stub = new RequestStub(url, data, method);
|
||||
stubTracker.addStub(stub);
|
||||
return stub;
|
||||
};
|
||||
@ -103,10 +103,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
stubs = [];
|
||||
};
|
||||
|
||||
this.findStub = function(url, data) {
|
||||
this.findStub = function(url, data, method) {
|
||||
for (var i = stubs.length - 1; i >= 0; i--) {
|
||||
var stub = stubs[i];
|
||||
if (stub.matches(url, data)) {
|
||||
if (stub.matches(url, data, method)) {
|
||||
return stub;
|
||||
}
|
||||
}
|
||||
@ -210,7 +210,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
this.readyState = 2;
|
||||
this.onreadystatechange();
|
||||
|
||||
var stub = stubTracker.findStub(this.url, data);
|
||||
var stub = stubTracker.findStub(this.url, data, this.method);
|
||||
if (stub) {
|
||||
this.response(stub);
|
||||
}
|
||||
@ -319,7 +319,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
};
|
||||
}
|
||||
|
||||
function RequestStub(url, stubData) {
|
||||
function RequestStub(url, stubData, method) {
|
||||
var normalizeQuery = function(query) {
|
||||
return query ? query.split('&').sort().join('&') : undefined;
|
||||
};
|
||||
@ -334,6 +334,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
}
|
||||
|
||||
this.data = normalizeQuery(stubData);
|
||||
this.method = method;
|
||||
|
||||
this.andReturn = function(options) {
|
||||
this.status = options.status || 200;
|
||||
@ -342,7 +343,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
this.responseText = options.responseText;
|
||||
};
|
||||
|
||||
this.matches = function(fullUrl, data) {
|
||||
this.matches = function(fullUrl, data, method) {
|
||||
var matches = false;
|
||||
fullUrl = fullUrl.toString();
|
||||
if (this.url instanceof RegExp) {
|
||||
@ -353,7 +354,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
query = urlSplit[1];
|
||||
matches = this.url === url && this.query === normalizeQuery(query);
|
||||
}
|
||||
return matches && (!this.data || this.data === normalizeQuery(data));
|
||||
return matches && (!this.data || this.data === normalizeQuery(data)) && (!this.method || this.method === method);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
describe("Webmock style mocking", function() {
|
||||
var successSpy, errorSpy, response, fakeGlobal, mockAjax;
|
||||
|
||||
var sendRequest = function(fakeGlobal, url) {
|
||||
var sendRequest = function(fakeGlobal, url, method) {
|
||||
url = url || "http://example.com/someApi"
|
||||
method = method || 'GET';
|
||||
var xhr = new fakeGlobal.XMLHttpRequest();
|
||||
xhr.onreadystatechange = function(arguments) {
|
||||
if (this.readyState == (this.DONE || 4)) { // IE 8 doesn't support DONE
|
||||
@ -11,7 +12,7 @@ describe("Webmock style mocking", function() {
|
||||
}
|
||||
};
|
||||
|
||||
xhr.open("GET", url);
|
||||
xhr.open(method, url);
|
||||
xhr.send();
|
||||
};
|
||||
|
||||
@ -65,6 +66,23 @@ describe("Webmock style mocking", function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe('stubs with method specified', function() {
|
||||
beforeEach(function() {
|
||||
mockAjax.stubRequest('http://example.com/myApi', null, 'POST').andReturn({responseText: 'post', status: '201'});
|
||||
mockAjax.stubRequest('http://example.com/myApi', null, 'PUT').andReturn({responseText: 'put', status: '200'});
|
||||
});
|
||||
|
||||
it("does not match a different method", function() {
|
||||
sendRequest(fakeGlobal, 'http://example.com/myApi', 'GET');
|
||||
expect(successSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("matches with the right method", function() {
|
||||
sendRequest(fakeGlobal, 'http://example.com/myApi', 'POST');
|
||||
expect(response.responseText).toEqual('post');
|
||||
});
|
||||
});
|
||||
|
||||
describe("with a query string", function() {
|
||||
beforeEach(function() {
|
||||
mockAjax.stubRequest("http://example.com/someApi?foo=bar&baz=quux").andReturn({responseText: "greetings", status: 422});
|
||||
|
Loading…
Reference in New Issue
Block a user