아래 테스트를 보도록 하겠습니다. 두 번째 context 안에 있는 테스트를 보시면 viewModel.bookName에 특정한 문자열을 할당하고 있습니다. 그저 empty 여부에 따라서만 변수의 값이 정의되는 이런 간단한 테스트에서는 문제가 없지만 어떤 테스트에서는 문자열의 길이, 영문/한글 여부 등에 따라서 테스트의 결과가 달라지는 경우도 있습니다.
이런 경우에 대비해서 테스트를 할 때는 특정한 테스트를 하드 코딩으로 미리 정해진 String을 넣기 보다는 테스트를 할 때마다 매번 달라지는 랜덤 String을 넣는 것이 좋습니다.
describe("isSaveButtonUnable") {
beforeEach {
prepare()
}
context("when bookName is empty") {
it("should be false") {
expect(viewModel.isSaveButtonUnable).to(beTrue())
}
}
context("when bookName is not empty") {
it("shoule be true") {
viewModel.bookName = "someBook"
expect(viewModel.isSaveButtonUnable).to(beFalse())
}
}
}
아래 코드는 아주 간단하게 다양한 길이의 Random String을 만드는 함수입니다. 앞으로 테스트를 하면서 많이 사용하게 될테니 따로 클래스를 만들어서 정의해두고 사용합니다.
class Random {
static var string: String {
let length = (1...100).randomElement() ?? 10
let alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var result = ""
for _ in 0..<length {
let randomAlphabet = alphabets.randomElement() ?? "a"
result += String(randomAlphabet)
}
return result
}
}
test 안에서 랜덤 스트링을 사용했습니다. 이렇게 하면 테스트를 할 때마다 다른 String이 사용되게 됩니다. 따라서 테스트가 특정 String에 의존하지 않고 독립적으로 수행될 수 있게 됩니다.
describe("isSaveButtonUnable") {
beforeEach {
prepare()
}
context("when bookName is empty") {
it("should be false") {
expect(viewModel.isSaveButtonUnable).to(beTrue())
}
}
context("when bookName is not empty") {
it("shoule be true") {
viewModel.bookName = Random.string
expect(viewModel.isSaveButtonUnable).to(beFalse())
}
}
}