需要帮助了解我测试函数的方式是否正确



我写了这个函数,当用户点击链接时调用它。该函数基本上创建用户数据的副本,更改一个字段(从而保持原始值不变,即不可变),然后使用新值更新数据库

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设置为在模拟值 (when(testEnv.mockUserRepository.update(confirmedUser)).thenReturn(Future{Some(confirmedUser)})true

我知道代码有效,因为在上面的模拟中,update方法需要confirmedUser或者换句话说,confirmed字段设置为true的用户。因此,如果我的代码不起作用,update就会被confirmed字段falseuser调用,mockito就会失败。

这是测试该方法的正确方法还是有更好的方法?

您无需在测试中初始化internalConfirmedProfile。重点是从confirmed=false开始,运行confirmSignupforUser方法,并确保输出confirmed=true.

您应该检查两件事:

  1. 检查返回值是否具有confirmed=true(您这样做)
  2. 检查存储库是否保存了该用户confirmed=true(您不检查)。要检查您是否需要在最后从存储库中加载用户。

相关内容

  • 没有找到相关文章

最新更新