Я написал эту функцию, которая вызывается, когда пользователь нажимает на ссылку. Функция в основном создает копию пользовательских данных с одним измененным полем (таким образом, сохраняя исходное значение неизменным, т.е. не изменяемым), а затем обновляет базу данных новым значением
def confirmSignupforUser(user:User):Future[Option[User]] = {
println("confirming user: "+user)
val newInternalProfile = user.profile.internalProfileDetails.get.copy(confirmed=true)//new data which should be added in the database
println("old internal profile: "+user.profile.internalProfileDetails.get)
println("new internal profile: "+newInternalProfile)
val newProfile = UserProfile(Some(newInternalProfile),user.profile.externalProfileDetails)
println("old profile: "+user.profile)
println("new profile: "+newProfile)
val confirmedUser = user.copy(profile=newProfile)
for(userOption <- userRepo.update(confirmedUser)) yield { //database operation
println("returning modified user:"+userOption)
userOption
}
}
Для проверки кода я написал следующую спецификацию
"confirmSignupforUser" should {
"change confirmed status to True" in {
val testEnv = new TestEnv(components.configuration)
val externalProfile = testEnv.externalUserProfile
val internalUnconfirmedProfile = InternalUserProfile(testEnv.loginInfo,1,false,None)
val internalConfirmedProfile = internalUnconfirmedProfile.copy(confirmed=true)
val unconfirmedProfile = UserProfile(Some(internalUnconfirmedProfile),externalProfile)
val confirmedProfile = UserProfile(Some(internalConfirmedProfile),externalProfile)
val origUser = User(testEnv.mockHelperMethods.getUniqueID(),unconfirmedProfile)
val confirmedUser = origUser.copy(profile = confirmedProfile)
//the argument passed to update is part of test. The function confirmSignupforUser should pass a confirmed profile
when(testEnv.mockUserRepository.update(confirmedUser)).thenReturn(Future{Some(confirmedUser)})
//// await is from play.api.test.FutureAwaits
val updatedUserOption:Option[User] = await[Option[User]](testEnv.controller.confirmSignupforUser(origUser))
println(s"received updated user option ${updatedUserOption}")
updatedUserOption mustBe Some(confirmedUser)
}
}
Я не уверен, правильно ли я тестирую метод. Единственный способ проверить, что поле confirmed
было изменено, - посмотреть возвращаемое значение confirmSignupforUser
. Но я на самом деле издеваюсь над значением, и я уже установил поле confirmed
в true
в проверяемом значении (when(testEnv.mockUserRepository.update(confirmedUser)).thenReturn(Future{Some(confirmedUser)})
.
Я знаю, что код работает, потому что в приведенном выше макете метод update
ожидает confirmedUser
или, другими словами, пользователя с полем confirmed
, установленным в true
. Поэтому, если бы мой код не работал, update
был бы вызван с user
, чье поле confirmed
было бы false
, а mockito
не состоялось бы.
Это правильный способ проверки метода или есть лучший способ?