記事


Swift コード内のエラーのテスト


コードがあなたの期待どおりにエラーを処理することを確認します。





概観


あなたのコードがエラーを throw する条件と、エラーを throw せずに復帰する条件を検証するテストを記述してください。エラーをチェックする expect(_:_:sourceLocation:) マクロと require(_:_:sourceLocation:) マクロのオーバーロードを使用してください。



あなたのコードが期待通りのエラーを throw するかどうかを検証する


テスト対象コードでエラーを throwtest するテスト関数を作成します。コードがエラーを throw した場合、あなたのテストは失敗します。


テスト対象コードが特定のエラーを throw したかを確認したり、エラーを throw するコードを発生後に長いテスト関数を継続したりするには、expect(throws:_:sourceLocation:performing:) の最初の引数としてそのエラーを渡し、テスト対象コードを呼び出すクロージャを渡します。


@Test func cannotAddToppingToPizzaBeforeStartOfList() {
  var order = PizzaToppings(bases: [.calzone, .deepCrust])
  #expect(throws: PizzaToppings.Error.outOfRange) {
    try order.add(topping: .mozarella, toPizzasIn: -1..<0)
  }
}

クロージャがエラーを throw せずに完了した場合、テストライブラリは問題を記録します。Swift コード内のエラーのテスト expect(_:_:sourceLocation:) の他のオーバーロードを使用すると、コードが与えられた型のエラーを throw するか、任意のブールテストに一致するかをテストできます。require(_:_:sourceLocation:) の同様のオーバーロードは、コードが期待されたエラーを throw しない場合、あなたのテストの実行を停止します。



あなたのコードがエラーを throw するかを検証する


テスト対象のコードが任意の型のエラーを throw することを確認するには、expect(throws:_:sourceLocation:performing:) または require(throws:_:sourceLocation:performing:) の最初の引数として (any Error).self を渡します。


@Test func cannotAddToppingToPizzaBeforeStartOfList() {
  var order = PizzaToppings(bases: [.calzone, .deepCrust])
  #expect(throws: (any Error).self) {
    try order.add(topping: .mozarella, toPizzasIn: -1..<0)
  }
}


あなたのコードがエラーを throw しないことを検証する


エラーを throw するテスト関数は失敗します。これは通常、テスト対象のコードがエラーを throw しないことをテストするのに十分です。テスト関数を停止せずに、throw されたエラーを問題として記録する必要がある場合は、エラーを Never と比較して下さい。


@Test func canAddToppingToPizzaInPositionZero() throws {
  var order = PizzaToppings(bases: [.thinCrust, .thinCrust])
  #expect(throws: Never.self) {
    try order.add(topping: .caper, toPizzasIn: 0..<1)
  }
  let toppings = try order.toppings(forPizzaAt: 0)
  #expect(toppings == [.caper])
}

クロージャが何かの エラーを throw した場合、テストライブラリは問題を記録します。コードがエラーを throw したときにテストを停止する必要がある場合は、expect(throws:_:sourceLocation:performing:) への呼び出しで囲むのではなく、テスト関数内にコードをインラインで含めてください。



あなたのコードによって throw されたエラーを検査する


#expect(throws:) または #require(throws:) を使用し、エラーが期待値と一致する場合、そのエラーは呼び出し元に返され、追加の検証を行うことができます。エラーが全く throw されなかった、または異なる型のエラーが throw されたために期待が失敗した場合、#expect(throws:)nil を返します。


@Test func cannotAddMarshmallowsToPizza() throws {
  let error = #expect(throws: PizzaToppings.InvalidToppingError.self) {
    try Pizza.current.add(topping: .marshmallows)
  }
  #expect(error?.topping == .marshmallows)
  #expect(error?.reason == .dessertToppingOnly)
}

どのような型のエラーが throw されるかわからない場合は、(any Error).self を渡します。





以下も見よ


エラーが throw されたか確認する


macro expect<E, R>(throws: E.Type, @autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R) -> E?

式が常に与えられた型のエラーを throw することを確認します。


macro expect<E, R>(throws: E, @autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R) -> E?

式が常に特定のエラーを throw することを確認します。


macro expect<R>(@autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R, throws: (any Error) async throws -> Bool) -> (any Error)?

式が常に何らかの条件に一致するエラーを throw することを確認します。

  廃止  


macro require<E, R>(throws: E.Type, @autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R) -> E

式が常に与えられた型のエラーを throw することを確認し、そうでない場合はエラーを throw します。


macro require<E, R>(throws: E, @autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R) -> E


macro require<R>(@autoclosure () -> Comment?, sourceLocation: SourceLocation, performing: () async throws -> R, throws: (any Error) async throws -> Bool) -> any Error

式が常に何らかの条件に一致するエラーを throw することを確認し、そうでない場合はエラーを throw します。

  廃止  














トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ