有一个辅助类DialogIdlingResource,我尝试运行我的测试。测试发生,除了这个测试。按下按钮后,一切都停止了。
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
带有两个辅助方法的代码段:
@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
}
ALSO 尝试解决下一个solution的问题。当我只运行我的一个测试时,所有的工作都很好。但如果我开始所有的测试,我会发现错误。暂停测试没有时间检查我的对话框中的示例文本,他打开了对话框,这就是全部。
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)
请帮助解决此问题。对不起我的英语。
答案 0 :(得分:1)
抱歉,您的IdlingResource看起来像是超级复杂的等待功能。
此代码段适用于我 - github link。您只需向ViewVisibilityIdlingResource构造函数提供所需的参数。其中一个是int viewId
,另一个是int visibility
。例如,如果您在对话框布局和可见性viewId
内提供任何View.GONE
,那么此资源将阻止Espresso测试,直到视图可见或直到向用户显示对话框。
答案 1 :(得分:0)
虽然没有抓住kotlin的语法。
isIdle()总是在主线程上执行,应该是非阻塞的。因此,而不是在isIdle()中调用isDialogRunning(), 在一个单独的线程中调用它并更新idlingResource的状态(如果视图匹配或超时),然后可以通过isIdle()进行检查。
希望有所帮助:)