Làm thế nào để viết một thử nghiệm dự kiến một cuộc gọi phương thức sử dụng nhanh và XCTest?XCTest mong đợi cuộc gọi phương thức với swift
Tôi có thể sử dụng OCMock, nhưng chúng không chính thức hỗ trợ nhanh chóng, do đó không có nhiều tùy chọn.
Làm thế nào để viết một thử nghiệm dự kiến một cuộc gọi phương thức sử dụng nhanh và XCTest?XCTest mong đợi cuộc gọi phương thức với swift
Tôi có thể sử dụng OCMock, nhưng chúng không chính thức hỗ trợ nhanh chóng, do đó không có nhiều tùy chọn.
Như bạn đã nói OCMock không hỗ trợ Swift (cũng không phải OCMockito), do đó, bây giờ cách duy nhất tôi thấy là tạo ra một bàn tay cán giả. Trong nhanh chóng này là một chút ít đau đớn vì bạn có thể tạo ra các lớp bên trong trong một phương pháp, nhưng vẫn không phải là tiện dụng như một khuôn khổ mocking.
Ở đây bạn có ví dụ. Mã này là tự giải thích, điều duy nhất tôi phải làm (xem EDIT 1 bên dưới) để làm cho nó hoạt động là khai báo các lớp và các phương thức mà tôi muốn sử dụng từ bài kiểm tra là public (dường như các lớp test không thuộc về cùng một mô-đun mã của ứng dụng - sẽ cố gắng tìm một giải pháp cho điều này).
EDIT 1 2016/4/27: Khai báo các lớp bạn muốn kiểm tra là công khai không cần thiết nữa vì bạn có thể sử dụng tính năng "@testable import ModuleName".
Các thử nghiệm:
import XCTest
import SwiftMockingPoC
class MyClassTests: XCTestCase {
func test__myMethod() {
// prepare
class MyServiceMock : MyService {
var doSomethingWasCalled = false
override func doSomething(){
doSomethingWasCalled = true
}
}
let myServiceMock = MyServiceMock()
let sut = MyClass(myService: myServiceMock)
// test
sut.myMethod()
// verify
XCTAssertTrue(myServiceMock.doSomethingWasCalled)
}
}
MyClass.swift
public class MyClass {
let myService: MyService
public init(myService: MyService) {
self.myService = myService
}
public func myMethod() {
myService.doSomething()
}
}
MyService.swift
public class MyService {
public init() {
}
public func doSomething() {
}
}
Tôi không muốn tạo một biến chỉ cho "doSomethingWasCalled" bên trong lớp giả và sau đó có một khẳng định cho mọi phương pháp tôi mong đợi được gọi. Tôi muốn một cái gì đó giống như tuyên bố một biến bên ngoài lớp giả với expectationWithDescription, thực hiện kỳ vọng của nó trong phương pháp lớp giả và sau đó gọi waitForExpectationsWithTimeout trong thử nghiệm. Nhưng điều đó không hiệu quả, thử nghiệm không biên dịch (hoặc cho tôi lỗi "SourceKitService Crashed", không thực sự nhớ và không thể kiểm tra ngay bây giờ vì mã của tôi không được biên dịch vì một thứ khác mà tôi triển khai). –
Ngoài ra tôi không thể ghi đè lên một phương pháp bên trong thử nghiệm như bạn đã làm. Lỗi tương tự, "SourceKitService Crashed". –
AFAIK XCTestExpectation là ý tưởng cho thử nghiệm không đồng bộ, tôi thấy không có lý do để sử dụng nó trừ khi bạn muốn như vậy. Về việc ghi đè phương thức đó, hãy chắc chắn rằng bạn tuyên bố công khai các phương thức và các lớp mà bạn muốn sử dụng trong bài kiểm tra của mình - mã của câu trả lời của tôi làm việc cho tôi trong Xcode. – e1985
thể trùng lặp của [Mocking trong Swift] (http://stackoverflow.com/ Câu hỏi/24174130/mocking-in-swift) – ColinE
Sự khác biệt từ câu hỏi của tôi với câu hỏi đó là tôi muốn mong đợi một cuộc gọi phương thức và không chỉ mô phỏng một phương pháp. –