2017-02-28 13 views
1

PACT Consumer Swiftを使用してXCUITestを実行しようとしていますが、どのように設定しようとしても、実際のネットワーク要求は、200のステータスコードとX-認証トークン。私は何が欠けていますか?ここで模擬ネットワーク応答を返さないXCUITest

import XCTest 
import PactConsumerSwift 
import Nimble 

class MyFeature: XCTestCase { 

    override func setUp() { 
     super.setUp()  
     let app = XCUIApplication() 
     app.launchArguments = ["FeatureTest"] 
     app.launch() 
     Nimble.AsyncDefaults.Timeout = 60 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testSuccessfulSignIn() { 
     let API = MockService(
      provider: "Sign In API", 
      consumer: "Sign In Consumer") 

     API 
      .given("user signs in with valid credentials") 
      .uponReceiving("valid credentials") 
      .withRequest(method: .POST, 
       path: "/login", 
       body: [ 
        "username": "john", 
        "password": "1234" 
       ]) 
      .willRespondWith(
       status: 200, 
       headers: [ 
        "X-Auth-Token":"Super-Cool-Token" 
       ]) 

     API.run { (testComplete) in 
      let app = XCUIApplication() 

      let usernameField = app.textFields["UsernameField"] 
      usernameField.tap() 
      usernameField.tap() 
      usernameField.typeText("john") 

      let passwordField = app.secureTextFields["PasswordField"] 
      passwordField.tap() 
      passwordField.typeText("1234") 

      app.buttons["LOGIN"].tap() 

      expect(app.staticTexts["Welcome!"].exists).to(beTrue()) 

      testComplete() 
     } 
    } 

} 

は、実際のログイン・ロジックです:

func attemptLogin(_ user:String? = nil, password:String? = nil) -> Promise<LoginResponse> { 
    if let 
     baseUrl = URLService.getBaseUrl(), 
     let url = URL(string: baseUrl + "login") 
    { 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

     if 
      let username = encode(string: user), 
      let password = encode(string: password) 
     { 
      request.httpBody = "username=\(username)&password=\(password)".data(using: String.Encoding.utf8) 
     } 
    } 

    // Sends request and does other stuff... 
} 

答えて

0

MockServerクラスをインスタンス化、バックグラウンドでモックサーバーを起動するここで

は、UIのテストケースです。実行中のURLは、MockServerインスタンスで利用可能になります。あなたの例ではこれは API.baseUrl

です。このURLと話すように(つまり、URLService.getBaseUrl()がモックサーバーのURLを返すように)テストするアプリを設定する必要があります。おそらく、あなたはvia launch引数や環境にURLを渡すことができます。 app.launchArguments = ["FeatureTest", API.baseUrl]

+0

ありがとうございました。それが助けになりました。モックサーバーが実行されているbaseUrlを既に持っていて、UrlServiceがそのベースURLを取得するために使用するxcconfigファイルがあります。今私の挑戦は、設定変数の代入を設定することです: - / – Adam

関連する問題