无法使用参数列表 ((ErrorType)、XMPPError) 调用 'XCTAssertEqual'

Cannot invoke 'XCTAssertEqual' with an argument list ((ErrorType), XMPPError)

在 MyModule 中,我有这个枚举:

enum MyError: ErrorType {
    case failToSendMessage
    case notAuthenticated
    case noResponseReceived
}

在 MyModuleTests 中:

import XCTest
@testable import MyModule

class MyModuleTests: XCTestCase {
    func testNotAuthenticated() {
        myClass.doSomething()
        .subscribeError { error in 
            XCTAssertEqual(error, MyError.notAuthenticated)
        }
    }
}

doSomething returns 一个 Observable.

为什么我会收到此错误消息: Cannot invoke 'XCTAssertEqual' with an argument list ((ErrorType), MyError) ?

正如错误提示的那样,您在这里尝试使用 XCTAssertEqual

(ErrorType)MyError 进行比较

1.Check 为什么你得到的错误是 (ErrorType) 而不是 ErrorType

2.Try 将(类型转换)ErrorType 转换为 MyError 后比较错误。

原来,ErrorType是不能直接比较的:

XCTAssertEqual(error, MyError.notAuthenticated as ErrorType)
// Cannot invoke 'XCTAssertEqual' with an argument list ((ErrorType), ErrorType)

XCTAssert(error == (MyError.notAuthenticated as ErrorType))
// Binary operator '==' cannot be applied to two 'ErrorType' operands

为了完成同样的事情,我这样做了:

        switch error {
        case MyError.notAuthenticated:
            ()
        default:
            XCTFail()
        }

您应该为您的 MyError 添加符合 Equatable 的扩展。

extension MyError: Equatable
{
    static func == (lhs: MyError, rhs: MyError) -> Bool {
        switch (lhs, rhs) {
        case (.failToSendMessage, .failToSendMessage):
            return true;

        case (.notAuthenticated, .notAuthenticated):
            return true;

        case (.noResponseReceived, .noResponseReceived):
            return true;

        default:
            return false;
        }
    }
}

然后,断言您的错误非常简单。

if let error = result.error {
                    XCTAssertTrue(error == MyError.notAuthenticated,"API returns 403");
                } else {
                    XCTFail("Response was not an error");
                }

我.