2013-06-14 3 views
1

을 남겨 : 나는 방법 age을 테스트하려는 경우 지금고려 예 통과 매개 변수

case class Home(description: String) 
case class Person(age: Int, race: String, home: Home) 
def age(p: Person): Person = { 
    val newAge = p.age + 1 
    p.copy(age = newAge, home = if (newAge == 18) Home("Under the bridge") else p.home) 
} 
it("Should move on 18th birthday") { 
    val person18yrs = age(Person(17, "Caucasian", Home("With parents"))) 
    person18yrs shouldBe Person(18, "Caucasian", Home("Under the bridge")) 
} 

을, 나는 그것을 기반으로 person 객체를 차별하지 않습니다 age 방법은 비록 분야 race를 작성해야 경주. 그것은 오직 통과 매개 변수입니다. 이 간단한 예제에서 그렇게 많은 작업은 아니지만 20 필드 클래스 계층 구조에서 두 필드로 작업 할 때 나는 행복하지 않습니다. 그리고 저는 행복하게 지내고 싶습니다. 그래서 몇 가지 해결책을 찾기 시작합니다.

하나의 해결책은 빈 필드를 Null로 채울 수 있습니다. 하지만 단점은 내가 구현을 변경하면 테스트 클래스 컴파일 오류를 테스트 실패로 변환한다는 것입니다. 그리고 나는 여전히이 null을 쓸 필요가있다.

다른 솔루션은 메소드를 작성하여 상호 작용하는 매개 변수를 승인하고 리턴 할 수 있습니다. 단점은 이름이 부족한 튜플을 반환해야하거나 메서드 매개 변수와 반환 형식을 캡슐화하는 일부 클래스를 만들어야한다는 것입니다.

또는 어쩌면 stackoverflow의 현명한 사람들은 내 지능의 반맹 눈으로 볼 수없는 다른 해결책이있을 수 있습니다. :-)

답변

0

당신은 당신의 경우 클래스하지만 적은 인수와 같은 이름을 가진 공장을 정의하고, 그들이하는 당신은 예를 들어, 기본 인수를 전달하는 객체를 해당 만들 수 :이 공장에

case class Person(age: Int, race: String, home: Home) 

def Person(age: Int): Person = Person(age, "", Home("")) 

액세스 테스트 스위트가 애플리케이션의 비 안정 관련 코드에서 사용되는 것을 피하기 위해 테스트 스위트로 제한 될 수있다.

1

완전히 채워진 사람을 프로토 타입으로 만들고 특정 테스트 케이스와 관련된 값으로 복사본을 만듭니다.

val protoype = Person(16, "Caucasian", Home("With parents")) 
val person18yrs = age(protoype.copy(age = 17))