在所有测试之前使用setUp运行一次对象创建

问题描述 投票:0回答:1

我有一个结构,它根据收到的参数返回各种类型的列表。这些列表很长并且需要时间来创建。我想编写单元测试来检查生成的列表是否具有所需的特征(长度、内容等)

问题

我想在每个测试中使用以下方法实例化该结构的不同版本:

override class function setUp

当我尝试时,出现错误:

instance member 'shortWords' cannot be used on type 'TestSampleWords'

示例

SampleWords.swift

import Foundation

struct SampleWords {
    var wordSize: String

    private var length: Int {
        switch wordSize {
        case "short":
            5
        case "long":
            10
        default:
            7
        }
    }

    private func randomString(length: Int) -> String {
        // Source: https://stackoverflow.com/a/26845710/1655567
        let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        return String((0..<length).map{ _ in letters.randomElement()! })
    }
    
    var wordsSet: [String] {
        (0..<1001).map { _ in randomString(length: length) }
    }
}

TestSampleWords.swift

import XCTest
@testable import SampleWords

final class TestsSampleWords: XCTestCase {

    private var longWords: SampleWords!
    private var shortWords: SampleWords!
    
    // I'm adding 'class' modifier as I want for the setUp to run only once
    override class func setUp()  {
        // At this junction I want to create a set of objects 
        // reflecting struct parameters and re-use them across tests
        longWords = SampleWords(wordSize: "long")
        shortWords = SampleWords(wordSize: "short")
    }

    override class func tearDown() throws {
        longWords = nil
        shortWords = nil
    }

    func testAreLists() {
        XCTAssertTrue(longWords.wordsSet is [String])
        XCTAssertTrue(shortWords.wordsSet is [String])
        // Further tests continue in this and other methods
    }


}

注释

  • override class function setUp
    替换为
    override function setUp
    即可进行测试;然而,这不是理想的行为。我想创建一组对象并在不同的测试中重复使用它们。
swift unit-testing struct xctest xctestcase
1个回答
2
投票

您无法从

private var longWords
内的静态/类上下文引用实例变量(
private var shortWords
class func
)。

解决方案非常简单 - 只需将这些变量也设置为

static/class
:

private class var longWords: SampleWords!
private class var shortWords: SampleWords!

然后您就可以在

class func setUp
中分配给它们。 一个小缺点是,当在非静态的测试函数中使用时,您必须将它们称为
TestsSampleWords.longWords
Self.longWords
(请注意此处
S
中的大写字母
Self
)。

© www.soinside.com 2019 - 2024. All rights reserved.