parent
b7c374a7a6
commit
6e77139011
@ -226,6 +226,62 @@ beforeEach(function(){
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Complex Requests
|
||||||
|
----------------
|
||||||
|
Third-party frameworks may do many requests you can not simply respond to.
|
||||||
|
Let's assume that you are talking to a SOAP service. SOAP services mostly have identical URL's, but responses differ by the XML request that was send using a POST request.
|
||||||
|
Let's register a response that will be used if the request body was matched against a RegExp.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
beforeEach(function(){
|
||||||
|
// first install the mock
|
||||||
|
jasmine.Ajax.install();
|
||||||
|
|
||||||
|
// Than register a request to which automatically will be responded
|
||||||
|
jasmine.Ajax.stubRequest(
|
||||||
|
'https://soap.domain.tld/ws/UserManager',
|
||||||
|
/.*\<registrationRequest\>.*/
|
||||||
|
).andReturn({
|
||||||
|
status: 200,
|
||||||
|
statusText: 'HTTP/1.1 200 OK',
|
||||||
|
contentType: 'text/xml;charset=UTF-8',
|
||||||
|
responseText: '<soap:Envelope><soap:Body><registrationResponse><username>foo</username><password>bar</password></registrationResponse></soap:Body></soap:Envelope>'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register another response for the same URL, but with different SOAP request
|
||||||
|
jasmine.Ajax.stubRequest(
|
||||||
|
'https://soap.domain.tld/ws/UserManager',
|
||||||
|
/.*\<loginRequest\>.*/
|
||||||
|
).andReturn({
|
||||||
|
status: 200,
|
||||||
|
statusText: 'HTTP/1.1 200 OK',
|
||||||
|
contentType: 'text/xml;charset=UTF-8',
|
||||||
|
responseText: '<soap:Envelope><soap:Body><loginResponse><success>true</success></loginResponse></soap:Body></soap:Envelope>'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Or if you also want to avoid the host part of the URL, you can register it using a RegExp for the URL, too.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
beforeEach(function(){
|
||||||
|
// first install the mock
|
||||||
|
jasmine.Ajax.install();
|
||||||
|
|
||||||
|
// Than register a request to which automatically will be responded
|
||||||
|
jasmine.Ajax.stubRequest(
|
||||||
|
/.*\/ws\/UserManager/,
|
||||||
|
/.*\<registrationRequest\>.*/
|
||||||
|
).andReturn({
|
||||||
|
status: 200,
|
||||||
|
statusText: 'HTTP/1.1 200 OK',
|
||||||
|
contentType: 'text/xml;charset=UTF-8',
|
||||||
|
responseText: '<soap:Envelope><soap:Body><registrationResponse><username>foo</username><password>bar</password></registrationResponse></soap:Body></soap:Envelope>'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
Jasmine
|
Jasmine
|
||||||
-------
|
-------
|
||||||
http://github.com/jasmine/jasmine
|
http://github.com/jasmine/jasmine
|
||||||
|
@ -526,7 +526,7 @@ getJasmineRequireObj().AjaxRequestStub = function() {
|
|||||||
this.query = split.length > 1 ? normalizeQuery(split[1]) : undefined;
|
this.query = split.length > 1 ? normalizeQuery(split[1]) : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.data = normalizeQuery(stubData);
|
this.data = (stubData instanceof RegExp) ? stubData : normalizeQuery(stubData);
|
||||||
this.method = method;
|
this.method = method;
|
||||||
|
|
||||||
this.andReturn = function(options) {
|
this.andReturn = function(options) {
|
||||||
@ -560,17 +560,23 @@ getJasmineRequireObj().AjaxRequestStub = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.matches = function(fullUrl, data, method) {
|
this.matches = function(fullUrl, data, method) {
|
||||||
var matches = false;
|
var urlMatches = false;
|
||||||
fullUrl = fullUrl.toString();
|
fullUrl = fullUrl.toString();
|
||||||
if (this.url instanceof RegExp) {
|
if (this.url instanceof RegExp) {
|
||||||
matches = this.url.test(fullUrl);
|
urlMatches = this.url.test(fullUrl);
|
||||||
} else {
|
} else {
|
||||||
var urlSplit = fullUrl.split('?'),
|
var urlSplit = fullUrl.split('?'),
|
||||||
url = urlSplit[0],
|
url = urlSplit[0],
|
||||||
query = urlSplit[1];
|
query = urlSplit[1];
|
||||||
matches = this.url === url && this.query === normalizeQuery(query);
|
urlMatches = this.url === url && this.query === normalizeQuery(query);
|
||||||
}
|
}
|
||||||
return matches && (!this.data || this.data === normalizeQuery(data)) && (!this.method || this.method === method);
|
var dataMatches = false;
|
||||||
|
if (this.data instanceof RegExp) {
|
||||||
|
dataMatches = this.data.test(data);
|
||||||
|
} else {
|
||||||
|
dataMatches = !this.data || this.data === normalizeQuery(data);
|
||||||
|
}
|
||||||
|
return urlMatches && dataMatches && (!this.method || this.method === method);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,4 +61,12 @@ describe('RequestStub', function() {
|
|||||||
expect(stub).toMatchRequest('/foo', 'baz=quux&foo=bar');
|
expect(stub).toMatchRequest('/foo', 'baz=quux&foo=bar');
|
||||||
expect(stub).not.toMatchRequest('/foo', 'foo=bar');
|
expect(stub).not.toMatchRequest('/foo', 'foo=bar');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can match the data or query params with a RegExp', function() {
|
||||||
|
var stub = new this.RequestStub('/foo', /ba[rz]=quux/);
|
||||||
|
|
||||||
|
expect(stub).toMatchRequest('/foo', 'bar=quux');
|
||||||
|
expect(stub).toMatchRequest('/foo', 'baz=quux');
|
||||||
|
expect(stub).not.toMatchRequest('/foo', 'foo=bar');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -17,7 +17,7 @@ getJasmineRequireObj().AjaxRequestStub = function() {
|
|||||||
this.query = split.length > 1 ? normalizeQuery(split[1]) : undefined;
|
this.query = split.length > 1 ? normalizeQuery(split[1]) : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.data = normalizeQuery(stubData);
|
this.data = (stubData instanceof RegExp) ? stubData : normalizeQuery(stubData);
|
||||||
this.method = method;
|
this.method = method;
|
||||||
|
|
||||||
this.andReturn = function(options) {
|
this.andReturn = function(options) {
|
||||||
@ -51,17 +51,23 @@ getJasmineRequireObj().AjaxRequestStub = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.matches = function(fullUrl, data, method) {
|
this.matches = function(fullUrl, data, method) {
|
||||||
var matches = false;
|
var urlMatches = false;
|
||||||
fullUrl = fullUrl.toString();
|
fullUrl = fullUrl.toString();
|
||||||
if (this.url instanceof RegExp) {
|
if (this.url instanceof RegExp) {
|
||||||
matches = this.url.test(fullUrl);
|
urlMatches = this.url.test(fullUrl);
|
||||||
} else {
|
} else {
|
||||||
var urlSplit = fullUrl.split('?'),
|
var urlSplit = fullUrl.split('?'),
|
||||||
url = urlSplit[0],
|
url = urlSplit[0],
|
||||||
query = urlSplit[1];
|
query = urlSplit[1];
|
||||||
matches = this.url === url && this.query === normalizeQuery(query);
|
urlMatches = this.url === url && this.query === normalizeQuery(query);
|
||||||
}
|
}
|
||||||
return matches && (!this.data || this.data === normalizeQuery(data)) && (!this.method || this.method === method);
|
var dataMatches = false;
|
||||||
|
if (this.data instanceof RegExp) {
|
||||||
|
dataMatches = this.data.test(data);
|
||||||
|
} else {
|
||||||
|
dataMatches = !this.data || this.data === normalizeQuery(data);
|
||||||
|
}
|
||||||
|
return urlMatches && dataMatches && (!this.method || this.method === method);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user