我有一个结构,它根据收到的参数返回各种类型的列表。这些列表很长并且需要时间来创建。我想编写单元测试来检查生成的列表是否具有所需的特征(长度、内容等)
我想在每个测试中使用以下方法实例化该结构的不同版本:
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
即可进行测试;然而,这不是理想的行为。我想创建一组对象并在不同的测试中重复使用它们。您无法从
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
)。