【发布时间】:2017-01-20 09:13:34
【问题描述】:
有一个辅助类 DialogIdlingResource,我尝试通过它运行我的测试。测试发生,除了这个。按下按钮后,一切都停止了。
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
使用两个辅助方法编写 sn-p 代码:
@Test
fun signInUserWithInvalidEmail() {
goToSignIn()
AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "kokojambo@mail.ru")
AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD)
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
val idlingResource = DialogIdlingResource()
registerDialogIdlingResource()
unregisterDialogIdlingResource()
}
private fun registerDialogIdlingResource() {
val instrumentation = InstrumentationRegistry.getInstrumentation()
idlingResource = DialogIdlingResource()
Espresso.registerIdlingResources(idlingResource)
}
private fun unregisterDialogIdlingResource() {
Espresso.unregisterIdlingResources(idlingResource)
}
很可能是regester和unregister(idlingResource)这两种方法报错
但其实应该可以的,只是可能在某个地方可能出错了,辅助类代码:
class DialogIdlingResource(private val waitTimeSeconds: Int = 5) :
IdlingResource {
private var resourceCallback: IdlingResource.ResourceCallback? = null
private var startTime = -1L
override fun getName(): String {
return DialogIdlingResource::class.java.name
}
override fun isIdleNow(): Boolean {
if (startTime < 0) {
startTime = System.currentTimeMillis()
}
val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime
if (timeOut)
throw TimeoutException("error")
val idle = !isDialogRunning
if (idle && resourceCallback != null) {
resourceCallback!!.onTransitionToIdle()
}
return idle
}
override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) {
this.resourceCallback = resourceCallback
}
private val isDialogRunning: Boolean
get() {
try {
onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning")))
.check(ViewAssertions.matches(isDisplayed()))
} catch (e: NoMatchingViewException) {
e.printStackTrace()
System.out.println("some text")
}
return true
}
还尝试解决下一个solution 的问题。当我只运行一项测试时,一切正常。但是如果我开始我的所有测试,我会发现错误。因为 test 没有时间检查我的对话框中的示例文本,所以他打开了对话框,仅此而已。
IdlingResource 类:
class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource {
private var callback: IdlingResource.ResourceCallback? = null
override fun getName(): String {
return "SignInScreenTest"
}
override fun isIdleNow(): Boolean {
val idle = isIdle
if (idle) callback!!.onTransitionToIdle()
return idle
}
val isIdle: Boolean
get() = activity != null && callback != null
override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) {
this.callback = resourceCallback
}
}
在我的测试中
val activity = mActivityTestRule.getActivity()
val idlingResource = ElapsedTimeIdlingResource(activity)
Espresso.registerIdlingResources(idlingResource)
AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning")
我再说一遍,就在我开始所有测试时,我需要在 registerIdlingResources 和 checktextView 之间设置睡眠 像这样的东西:
SystemClock.sleep(5000)
请帮助解决这个问题。对不起我的英语。
【问题讨论】:
标签: android kotlin android-espresso