2014-09-26 24 views
7

ile yöntem çağrısının beklenmesini bekler. Yöntem çağrısı, Xift ve XCTest kullanarak nasıl beklenir?XCTest,

OCMock'ı kullanabilirim, ancak resmi olarak hızlı bir şekilde desteklemiyorlar, bu nedenle çok fazla seçenek yok.

+0

[Swift Mocking] olası yinelenen (http://stackoverflow.com/ sorular/24174130/taklitçi-hızlı) – ColinE

+1

Benim sorumdan bu soruya bir fark, bir yöntem çağrısı beklemek istiyorum ve sadece bir yöntem alayım. –

cevap

4

OCMock'un Swift'i (veya OCMockito'yu) desteklemediğini söylediğin gibi, şimdi gördüğüm tek yol, elle yuvarlanmış bir alay oluşturmak. Hızlı bir şekilde, bu bir yöntem içinde iç sınıflar oluşturabileceğiniz, ancak hala alaycı bir çerçeve kadar kullanışlı değil, çünkü bu biraz daha az acı verici.

İşte bir örneğiniz var. Kod kendiliğinden açıklayıcıdır, yapmam gereken tek şey (aşağıdaki EDIT 1'e bakınız) çalışmasını sağlamak için kullanacağım sınıfları ve yöntemleri kamuya açıklamaktır (test sınıflarının Aynı uygulamanın kod modülü - buna bir çözüm bulmaya çalışacağız).

EDIT 1 2016/4/27: "@testable import ModuleName" özelliğini kullanabildiğinizden, sınamak istediğiniz sınıfların public olarak bildirilmesi gerekli değildir.

testi:

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

Sahte sınıf içinde sadece "doSomethingWasCalled" için bir değişken oluşturmak ve sonra çağrılmasını beklediğim her yöntem için bir iddiaya sahip olmak istemem. Ben mock class yöntemi ile beklenti yerine getirmek ve daha sonra test waitForExpectationsWithTimeout çağrısı ile motation sınıfının dışında bir değişken bildirmek gibi bir şey daha istedim. Ama bu işe yaramıyor, test derlemiyor (veya bana "SourceKitService Crashed" hatası veriyor, gerçekten hatırlamıyor ve şu anda test edemiyorum çünkü kodum başka bir şey yüzünden derleme değil) uygulanması. –

+0

Ayrıca, testte yaptığınız gibi bir yöntemi geçersiz edemiyorum. Aynı hata, "SourceKitService Crashed". –

+0

AFAIK XCTestExpectation, asenkron test için kullanılıyor, bunu istemediğiniz sürece kullanmak için bir neden göremiyorum. Bu yöntemi geçersiz kılma hakkında, testinizde kullanmak istediğiniz yöntemleri ve sınıfları herkese açıkladığınızdan emin olun - yanıtımın kodu Xcode'ta benim için çalışır. – e1985

İlgili konular