如何测试moya请求

时间:2017-06-09 09:47:46

标签: ios swift testing moya

我想开始为我的所有moya请求编写测试用例。我在互联网上搜索过,但没有找到。 *如何测试简单的moya .get请求。

感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

这就是我和Moya一起进行单元测试的方法。我有我的NetworkManager来发出所有请求,init有一个默认参数(在生产代码上使用它),所以我们可以在测试时指定不同的提供者。

struct NetworkManager {
    private let provider: MoyaProvider<MultiTarget>

    init(provider: MoyaProvider<MultiTarget> = MoyaProvider<MultiTarget>()) {
        self.provider = provider
    }

    func createUser(_ user: User, completion: @escaping (Result<User>) -> Void) {
        provider.request(MultiTarget(UserApi.createUser(user: user))) { (result) in
            switch result {
            case .success(let response):
                do {
                    let user = try response.map(User.self)
                    completion(.success(user))
                } catch let error {
                    completion(.error(error))
                }
            case .failure(let error):
                completion(.error(error))
            }
        }
    }

    // other requests...
}

因此,在生产代码中,您可以使用以下内容:

let manager = NetworkManager()
let viewController = ViewController(networkManager: manager)

测试之类的内容:

class TestMoyaTests: XCTestCase {    
    var networkManager: NetworkManager!

    override func setUp() {
        super.setUp()
        networkManager = NetworkManager(provider: MoyaProvider<MultiTarget>(stubClosure: MoyaProvider.immediatelyStub))
    }

    func testGetUser() {
        let expected = User(id: "1", name: "John")
        var response: User?
        networkManager.getUser(id: "1") { (result) in
            if case let .success(user) = result {
                response = user
            }
        }
        XCTAssert(response == expected)
    }

    // other tests...
}

或者,如果您要查看的是MoyaProvider本身,您可以查看Moya's team如何进行测试。 由于存根被立即返回,因此不需要进行任何预期或类似的事情(这就是Moya的团队测试.sampleData)。

希望这有帮助!

答案 1 :(得分:1)

您可以使用OCMock来存根完成处理程序并返回您自己的完成处理程序。 示例 -

__block UIView *mockViewAnimation;
    __block void(^animationsBlock)(void);
    __block void(^completionBlock)(BOOL);

    beforeEach(^{
        void (^viewAnimation)(NSInvocation *) = ^(NSInvocation *invocation) {
            [invocation retainArguments];
            [invocation getArgument:&animationsBlock atIndex:5];
            [invocation getArgument:&completionBlock atIndex:6];
        };

        mockViewAnimation = OCMClassMock([UIView class]);

        // This stub tests the animation with duration, delay, and options
        // Animation and Completion aren't tested here because they'll have their own tests.

        OCMStub([mockViewAnimation animateWithDuration:1
                                                 delay:0
                                               options:UIViewAnimationOptionCurveEaseIn
                                            animations:[OCMArg any]
                                            completion:[OCMArg any]]).andDo(viewAnimation);

        [sut viewDidLoad];
    });

然后你可以调用animationsBlock();或completionBlock(是);

这是模拟完成处理程序的示例,您可以使用相同的逻辑来模拟Mayo完成处理程序。或其他任何东西。