нужна помощь в понимании, если способ проверки функции является правильным - PullRequest
0 голосов
/ 31 марта 2019

Я написал эту функцию, которая вызывается, когда пользователь нажимает на ссылку. Функция в основном создает копию пользовательских данных с одним измененным полем (таким образом, сохраняя исходное значение неизменным, т.е. не изменяемым), а затем обновляет базу данных новым значением

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 не состоялось бы.

Это правильный способ проверки метода или есть лучший способ?

1 Ответ

0 голосов
/ 31 марта 2019

Вам не нужно инициализировать internalConfirmedProfile в вашем тесте. Все дело в том, чтобы начать с confirmed=false, запустить метод confirmSignupforUser и убедиться, что вывод равен confirmed=true.

Вы должны проверить 2 вещи:

  1. проверьте, что возвращаемое значение имеет confirmed=true (что вы делаете)
  2. убедитесь, что в хранилище сохранен этот пользователь с confirmed=true (который вы не проверяете). Чтобы проверить, что вам нужно будет загрузить пользователя обратно из хранилища в конце.
...