- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Kotlin 中使用 RxJava 在 MVP 架构中测试我的演示者。我创建了一个测试规则,用 TestScheduler
替换常用的调度程序,以便能够测试异步请求:
class TestSchedulerRule : TestRule {
val testScheduler = TestScheduler()
override fun apply(base: Statement, d: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
RxJavaPlugins.setInitIoSchedulerHandler { testScheduler }
RxJavaPlugins.setInitComputationSchedulerHandler { testScheduler }
RxJavaPlugins.setInitNewThreadSchedulerHandler { testScheduler }
RxJavaPlugins.setInitSingleSchedulerHandler { testScheduler }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { testScheduler }
try {
base.evaluate()
} finally {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
}
}
}
}
}
这是我的测试课。问题是每个测试都通过了,如果我单独运行它们,但如果我运行整个套件,只有第一个通过。 TestScheduler
应该有问题,因为如果我使用立即调度程序,它就可以工作。
class UserListPresenterTest {
@Rule @JvmField
val testSchedulerRule = TestSchedulerRule()
@Mock
lateinit var mockGetUsers: GetUsers
@Mock
lateinit var mockView: UserListView
lateinit var userListPresenter: UserListPresenter
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
userListPresenter = UserListPresenter(mockGetUsers)
}
@Test
fun testGetUsers_errorCase_showError() {
// Given
val error = "Test error"
val single: Single<List<UserViewModel>> = Single.create {
emitter -> emitter?.onError(Exception(error))
}
// When
`when`(mockGetUsers.execute(Mockito.anyInt(), Mockito.anyBoolean())).thenReturn(single)
userListPresenter.attachView(mockView)
userListPresenter.getUsers()
testSchedulerRule.testScheduler.triggerActions()
// Then
verify(mockView).hideLoading()
verify(mockView).showError()
}
@Test
fun testGetUsers_successCaseFirstPage_clearList() {
// Given
val users = listOf(UserViewModel(1, "Name", 1000, ""))
val single: Single<List<UserViewModel>> = Single.create {
emitter -> emitter?.onSuccess(users)
}
// When
`when`(mockGetUsers.execute(Mockito.anyInt(), Mockito.anyBoolean())).thenReturn(single)
userListPresenter.attachView(mockView)
userListPresenter.getUsers()
testSchedulerRule.testScheduler.triggerActions()
// Then
verify(mockView).clearList()
}
}
这是我在控制台中得到的错误:
Wanted but not invoked:
mockView.hideLoading();
-> at com.example.tamaskozmer.kotlinrxexample.UserListPresenterTest.testGetUsers_errorCase_showError(UserListPresenterTest.kt:57)
Actually, there were zero interactions with this mock.
at com.example.tamaskozmer.kotlinrxexample.UserListPresenterTest.testGetUsers_errorCase_showError(UserListPresenterTest.kt:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at com.example.tamaskozmer.kotlinrxexample.TestSchedulerRule$apply$1.evaluate(TestSchedulerRule.kt:28)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)
UserListPresenter 类
class UserListPresenter(private val getUsers: GetUsers) : BasePresenter<UserListView>() {
private val offset = 5
private var page = 1
private var loading = false
fun getUsers(forced: Boolean = false) {
loading = true
if (forced) {
resetPaging()
}
getUsers.execute(page, forced)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
users ->
loading = false
if (page == 1) {
view?.clearList()
}
view?.addUsersToList(users)
view?.hideLoading()
page++
},
{
loading = false
view?.showError()
view?.hideLoading()
})
}
private fun resetPaging() {
page = 1
}
fun onScrollChanged(lastVisibleItemPosition: Int, totalItemCount: Int) {
if (!loading) {
if (lastVisibleItemPosition >= totalItemCount - offset) {
getUsers()
}
}
if (loading && lastVisibleItemPosition >= totalItemCount) {
view?.showLoading()
}
}
}
最佳答案
刚刚解决了同样的问题。您应该定义您的调度程序,而不是在规则中指定它们。 RxAndroidPlugins 将在 TestRule.apply 将另一个实例用于新测试之后保留 TestScheduler 的第一个实例。
将设置调度程序处理程序放在伴随对象中会有所帮助
companion object {
val testScheduler: TestScheduler
init {
testScheduler = TestScheduler()
RxAndroidPlugins.setInitMainThreadSchedulerHandler { _ -> testScheduler }
RxJavaPlugins.setInitComputationSchedulerHandler { _ -> testScheduler }
RxJavaPlugins.setInitIoSchedulerHandler { _ -> testScheduler }
}
}
关于android - 运行多个测试时,只有第一个测试通过 TestScheduler (Kotlin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241898/
我创建了以下辅助方法来协助测试可观察对象: public static void ExecuteObservableTest(IObservable observable, Action ac
我正在测试单个用例。但是测试观察者不会在测试环境中发出任何东西。 即使我将 subscribeOn() 从 Schedulers.newThread() 更改为TestScheduler() 仍然测试
根据一些评论,我应该明确表示这个问题是关于为什么 TestScheduler 会抛出空引用异常,而不是如何让测试通过。一个较早的示例假定与 TPL 的交互是问题的原因,但我现在发现这不是触发行为所必需
我正在尝试测试一个函数,其中流的元素在延迟后一个接一个地分派(dispatch),我能够使用 Thread.sleep 使我的测试工作。但是,当我使用 TestScheduler.advanceTim
当我这样做时: testScheduler.Schedule("Hello world",(scheduler, state) => Console.WriteLine(state)); testSc
我对 rx/ReactiveUi 非常陌生,想使用 TestScheduler 编写一个 xunit 测试来检查检索搜索建议的限制是否正常工作。 想法是使用 TestScheudler 进行计时,更改
我正在使用 RX 进行一些(非常基本的)事件订阅:- public void StartListening(IObservable observable) { subscription = ob
我试图让 Jasmine、promises 和 Rx.TestScheduler 一起很好地发挥作用,但我遇到了一个似乎无法解决的障碍。 我想要实现的是使用 RxJs 和 Jasmine 测试延迟 p
我正在尝试在 Kotlin 中使用 RxJava 在 MVP 架构中测试我的演示者。我创建了一个测试规则,用 TestScheduler 替换常用的调度程序,以便能够测试异步请求: class Tes
我正在尝试了解如何在 C# 中实现以下目标 我有这个类的列表 public class StockTickerChangeHistory { public DateTime Time;
我正在尝试在测试中使用带有异步方法的 reactiveui 测试调度程序。 等待异步调用时测试挂起。 根本原因似乎是在异步方法中等待的命令。 [Fact] public async T
我一直面临主题和 TestScheduler 的问题。如果我使用 Trampoline 调度程序,我的测试会通过,但由于某种原因,如果我使用 TestScheduler,测试会失败。 这是我的示例测试
这很愚蠢,但我似乎找不到包含 TestScheduler 的 .net rx nuget 包 请指出正确的方向。 最佳答案 TestScheduler 在 Microsoft.Reactive.Tes
所以我正在尝试在使用 Akavache 的应用程序中测试缓存行为。我的测试看起来像这样: using Akavache; using Microsoft.Reactive.Testing; using
我有一个测试代码的例子: [Fact] public void Should_only_contain_most_recent() { var window = Tim
我正在尝试在 RxJs 版本 5 中使用 Observable.interval 编写示例单元测试。我正在运行以下代码,但我的 observable 只触发一次,而不是预期的 20 次. it('do
我想编写一个单元测试来验证下面的 callInit 方法。但是,我在该行包含 subscribe( 的地方遇到了空指针异常。我的问题是如何在下面的方法中验证 onnext 和 onerror 条件?
tl;dr 是否可以在不重写的情况下对这段代码进行单元测试? http://jsbin.com/jezosegopo/edit?js,console const keyUpObserver = ($i
我想检查我创建的 IObservable 是否尊重“完成后,我将取消订阅你” 的礼貌。乍一看,我的代码似乎有问题。但是删除我的代码,只使用 TestScheduler 提供的 Observable 和
我是 ReactiveUI 的新手。我有以下简单设置:可以指定 csv 的路径,并将包含的数据点显示给用户(使用 oxyplot)。现在我正在尝试测试以下订阅: public GraphViewMod
我是一名优秀的程序员,十分优秀!