使用 XCTest 测试其中包含“try-catch”的方法

Posted

技术标签:

【中文标题】使用 XCTest 测试其中包含“try-catch”的方法【英文标题】:Testing a method that has a `try-catch` inside it using XCTest 【发布时间】:2015-11-05 05:13:50 【问题描述】:

我正在尝试测试其中包含 try-catch 的方法,但测试没有继续,并且未考虑 catch 块。

假设我们有这个:

class Foo

    func fetchData(request: NSFetchRequest) -> [AnyObject]?
    
        var data: [AnyObject]? = nil
        do 
            data = try context.executeFetchRequest(request)
         catch 

        return data
    

    func fetchData(entity: String, predicate: NSPredicate?) -> [AnyObject]?
    
        let entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: context)
        let request = NSFetchRequest()
        request.entity = entity
        request.predicate = predicate
        return fetchData(request)
    


class SampleTests: XCTestCase

    // Assume that entity 'Employee' does not exist in the core data model
    func testFetchDataWithNonExistingEntity()
    
        let foo = Foo()
        let predicate = NSPredicate(format: "id == %i", 22345)
        let data = foo.fetchData("Employee", predicate: predicate)
        XCTAssertNil(data, "Data should be nil.")
    

测试在data = try context.executeFetchRequest(request)停止。

【问题讨论】:

它编译了吗?您使用一个参数定义了函数 fetchData,而不是使用两个参数调用相同的函数。你的例子有问题 @user3441734 这叫做函数重载,仅供参考。 啊哈,对不起,你有两个版本:-)。行数据中的执行停止(崩溃) = .... ? 【参考方案1】:

你有一个空的 catch 块。

您可以添加:

catch let error as NSerror 
    // Do something with the error, e.g. return non-nil value.
    print("error \(error)")
    return []

处理错误。

一些额外的尝试:

确保在测试中为您的目标方案选中Debug executable

如果您打开了 测试失败 断点,这可能存在冲突,您应该将其关闭。

【讨论】:

@mownier 因为你的函数返回 [AnyObject]?,你需要返回一个 AnyObject 或 nil 数组。因此,尝试在数组中返回错误。 @DanielZhang 我试过了,但还是一样。测试执行不经过catch 块。 @mownier 您确定收到错误消息吗?如果是这样,当您在 catch 块的返回行上设置断点时,您不会在那里中断吗? @DanielZhang 是的,我试过了,不幸的是我没有在那条线上停下来。您是否应该尝试一下。 @mownier 如果您可以发布指向您的项目的链接,我可以看看它。我已经测试了相应的设置,所以我不知道除了我的建议之外会发生什么。【参考方案2】:
struct MyError: ErrorType 
    let msg: String = "my error"


// non throwing function
func f() 

do 
    // will never go to chatch
    try f()
 catch 
    print("catch")


print("continue")

// throwing function 
func f2() throws 
    throw MyError()


do 
    try f2()
 catch 
    print("catch")

print("continue")

在这两种情况下,您的数据都应该为零!如果您在 do / catch 块内停止执行,则意味着执行失败(您的函数有问题)

【讨论】:

以上是关于使用 XCTest 测试其中包含“try-catch”的方法的主要内容,如果未能解决你的问题,请参考以下文章

在非测试目标中使用 XCTest

现有项目的 XCTest

从一个类中使用 xctest 框架运行测试类

构建 XCTest 时找不到文件错误

使用 Realm 进行 Swift XCTest UI 测试

我可以使用 XCTest 测试我的应用程序中某个部分的性能吗?