首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Moya请求编写单元测试

为Moya请求编写单元测试
EN

Stack Overflow用户
提问于 2017-06-09 17:47:46
回答 2查看 3.2K关注 0票数 6

我想开始为我所有的Moya请求编写测试用例。如何测试从Swift生成的简单Moya .get请求?

EN

回答 2

Stack Overflow用户

发布于 2018-02-22 21:40:59

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

代码语言:javascript
复制
class 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...
}

因此,在production代码中,您可以获得如下内容:

代码语言:javascript
复制
let manager = NetworkManager()
let viewController = ViewController(networkManager: manager)

测试上,类似于:

代码语言:javascript
复制
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的方式)。

希望这能有所帮助!

票数 6
EN

Stack Overflow用户

发布于 2017-06-09 19:04:04

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

代码语言:javascript
复制
__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完成处理程序。或者其他任何东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44454587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档