https://github.com/tattn/replacer
An easy-to-use library to stub HTTP requests using URLSession and to swizzle methods
https://github.com/tattn/replacer
ios methodswizzling stub swift urlsession xctest
Last synced: 8 months ago
JSON representation
An easy-to-use library to stub HTTP requests using URLSession and to swizzle methods
- Host: GitHub
- URL: https://github.com/tattn/replacer
- Owner: tattn
- License: mit
- Created: 2017-01-02T04:31:35.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-07-22T16:19:07.000Z (almost 4 years ago)
- Last Synced: 2025-10-10T19:16:29.132Z (9 months ago)
- Topics: ios, methodswizzling, stub, swift, urlsession, xctest
- Language: Swift
- Homepage:
- Size: 47.9 KB
- Stars: 30
- Watchers: 2
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
Replacer
===
[](https://travis-ci.org/tattn/Replacer)
[](https://github.com/Carthage/Carthage)
[](http://cocoapods.org/pods/Replacer)
[](http://cocoapods.org/pods/Replacer)
[](http://cocoapods.org/pods/Replacer)
[](https://developer.apple.com/swift)
Replacer is an easy-to-use library to stub HTTP requests and to swizzle methods.
Specifically, URLSession's response can be replaced with any JSON, Data, and so on....
It uses **method chaining** to set stubs up.
# How to use
## Stub HTTP Request
### XCTest
```swift
import Replacer
import TestReplacer
class SampleTests: XCTestCase {
func testJSONFile() {
// register a stub
self.urlStub.url("echo.jsontest.com").json(["test": "data"])
// load sample.json & register a stub.
self.urlStub.json(filename: "sample")
let expectation = self.expectation(description: "")
let url = URL(string: "http://echo.jsontest.com/key/value/one/two")!
URLSession(configuration: .default).dataTask(with: url) { data, _, _ in
let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: String]
XCTAssert(json["test"] == "data")
expectation.fulfill()
}.resume()
self.waitForExpectations(timeout: 0.02, handler: nil)
}
}
```
### Quick & Alamofire
```swift
class SampleSpecs: QuickSpec {
override func spec() {
describe("Quick compatibility test") {
context("using JSON file") {
beforeEach() {
// wait for 1.5s
self.urlStub.url("echo.jsontest.com/[a-z]+/.*")
.httpMethod(.post)
.json(["test": "data"])
.delay(1.5)
}
it("returns mock data") {
var json: [String: String]?
Alamofire.request("http://echo.jsontest.com/key/value/one/two", method: .post).responseJSON { response in
json = response.result.value as? [String: String]
}
// SessionManager is also OK.
// SessionManager.default.request("http://echo.jsontest.com/key/value/one/two").responseJSON { _ in }
expect(json?["test"]).toEventually(equal("data"))
}
}
}
}
}
```
## Method Swizzling
```swift
import UIKit
import Replacer
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Replacer.replaceInstance(#selector(UIViewController.viewWillAppear(_:)),
of: UIViewController.self,
with: #selector(UIViewController.orig_viewWillAppear(_:)),
of: UIViewController.self)
return true
}
}
extension UIViewController {
func orig_viewWillAppear(_ animated: Bool) {
orig_viewWillAppear(animated)
print("swizzled")
}
}
```
# Installation
## Carthage
```ruby
github "tattn/Replacer"
```
## CocoaPods
```ruby
pod 'Replacer'
```
# Documentation
- [Stub Reference](https://github.com/tattn/Replacer/blob/master/Documentations/Reference.md)
# Contributing
1. Fork it!
2. Create your feature branch: `git checkout -b my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. Submit a pull request :D
# License
Replacer is released under the MIT license. See LICENSE for details.