2014-09-26 20 views
7

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.

+0

thể trùng lặp của [Mocking trong Swift] (http://stackoverflow.com/ Câu hỏi/24174130/mocking-in-swift) – ColinE

+1

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. –

Trả lời

4

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() { 

    } 

} 
+0

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). –

+0

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". –

+0

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

Các vấn đề liên quan