Đang chờ câu trả lời bằng @mattt Tôi đăng một ví dụ về mã của tôi.
Giả sử chúng tôi có lớp học Client
chịu trách nhiệm gọi một dịch vụ web đơn giản. Lớp này triển khai thực hiện một hàm có tên là userSignIn
thực hiện đăng nhập bằng WS.
Đây là mã cho userSignIn
chức năng:
func userSignIn(
#email:String,
password:String,
completionHandler: (Bool, String?, NSError?) -> Void
)-> Void
{
var parameters:[String:AnyObject] = [
"email":email,
"password":password,
]
Alamofire.request(.POST, Client.urlPath, parameters: parameters, encoding: ParameterEncoding.JSON).responseJSON {
(request, response, JSON, responseError) -> Void in
// Setup callback params
// HERE WE INJECT THE "FAKE" DATA--------
var operationComplete = false
var accessToken:String?
var error:NSError?
// --------------------------------------
if let statusCode = response?.statusCode {
// Check for errors and build response data
(operationComplete, accessToken, error) = self.checkSignInResponse(statusCode, JSON: JSON)
}
// Call the completion handler
completionHandler(operationComplete, accessToken, error)
}
}
Mục đích của chức năng là để nhận mã từ dịch vụ web nếu thông tin được truyền bởi người sử dụng là chính xác.
Chức năng checkSignInResponse
(tôi không khai báo mã của nó kể từ khi nó không phải là hữu ích cho các câu trả lời) có vai trò để valorise 3 biến operationComplete
, accessToken
và error
tùy thuộc vào phản ứng JSON nhận.
Bây giờ, 3 biến có giá trị chúng tôi gọi là completionHandler
khi sử dụng chúng.
Làm thế nào để giả lập chức năng này ?!
Để mô phỏng đáp ứng, tôi ghi đè hàm userSignIn
trực tiếp vào hàm kiểm tra (như được giải thích bởi bài viết NSHipster).
func testUserSignIn_whenParamsAreInvalid(){
class MockClient:Client {
override func userSignIn(#email: String, password: String, completionHandler:
(Bool, String?, NSError?) -> Void) {
// Set callback params
var operationComplete = false
var accessToken:String? = nil
var error:NSError? = NSError(domain: "Testing", code: 99, userInfo: nil)
completionHandler(operationComplete, accessToken, error)
}
}
signInViewController!.client = MockClient()
signInViewController!.loadView()
fillRegisterFieldsWithDataAndSubmit(femail(), password: fpassword())
XCTAssertNotNil(signInViewController!.error, "Expect error to be not nil")
}
sau đó tôi thay thế các client
bên trong bộ điều khiển điểm cho rằng tôi đang thử nghiệm sử dụng của tôi "chế giễu" khách hàng. Trong trường hợp này, tôi kiểm tra rằng bộ điều khiển chuyển tới thông tin chức năng không hợp lệ vì vậy tôi kiểm tra xem thuộc tính error
của bộ điều khiển không phải là không. Để ép buộc dữ liệu này, tôi chỉ cần đặt operationComplete
thành sai và tôi tạo một số NSError
.
Điều đó có ý nghĩa gì với bạn không? Tôi không chắc rằng thử nghiệm này là một thử nghiệm tốt ... nhưng ít nhất tôi có thể xác minh luồng dữ liệu.
Nghĩa đen tìm kiếm điều tương tự ngay bây giờ ... –
đã bạn con nó ra? –
Xem http://stackoverflow.com/questions/10807480/stubbing-mocking-up-webservices-for-an-ios-app – mattt