问题标签 [android-fragmentscenario]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
206 浏览

android - 使用带有嵌套 NavHostFragments 的 FragmentScenario 会使某些导航在测试期间无法验证

在我的应用程序中,我有一个包含 NavHostFragment 的 MainActivity。那NavHostFragment是用来展示Fragment的,其中一些有自己的NavHostFragment。

例如,MainActivity 持有 NavHostFragment1,它指向默认显示 FragmentA 的 main_nav_graph.xml。用户与 Fragment A 交互以启动包含 NavHostFragment2 的 MasterDetailFragment。

所以 main_nav_graph.xml 看起来像: FragmentA -> MasterDetailFragment

当用户在 MasterDetailFragment 中并单击后退按钮时,我们拦截后按并向用户显示 CancelConfirmationFragment。如果用户确认他们想要离开屏幕,那么我们需要执行导航回到 FragmentA。这是它变得有点棘手的地方。

如果我只是盲目地使用 CancelConfirmationFragment 中的 findNavController() 函数,那么它将获得嵌套的 NavHostFragment (NavHostFragment2) 的句柄并尝试使用它执行导航,这将是不正确的。我真正需要的是在 MainActivity 中获取 NavHostFragment1 的句柄。为此,我创建了一个 MainActivity 实现的接口,该接口在调用时返回 MainActivity 的 NavHostFragment。

当我手动测试我的应用程序时,效果很好。但是,当我单独在 MasterDetailFragment 上运行 Instrumentation 测试时,我遇到了一个问题,因为我实际上没有 MainActivity 的实例来保存我的 MasterDetailFragment,我有一个 FragmentScenario 创建的 Activity 实例,它没有实现我的特殊接口。

为了让我的仪器测试正常工作,我停止使用 FragmentScenario 并专门为名为 FakeMainActivity 的测试创建一个 Activity。FakeMainActivity 将有一个 NavHostFragment 并将实现 MainActivity 实现的特殊接口。在测试设置中,我可以将一个模拟导航控制器传递给 FakeMainActivity 并验证当用户确认他们想要导航回模拟导航控制器是否已对其进行了特定调用时。这似乎是一个不错的解决方案,但是,我觉得我可以通过任何导航目的地(即使是无法到达的)并且测试会通过,但实际上它不会,所以我什至不确定测试是否真的很值得写。

我是否从根本上错误地使用了导航组件或 FragmentScenario?

一般来说,这只是一件很难测试的事情吗?

我是否应该在非隔离测试(如 e2e 测试或两个片段之间的集成测试)中测试这样的导航(从一个导航主机移动到另一个)?

如果 FragmentScenario 可以接受允许由它启动自定义 Activity 而不是 FragmentScenario 提供的 Activity 的参数,这是否有意义?

0 投票
1 回答
275 浏览

android - FragmentController vs FragmentScenario

RoblectricFragmentController允许我们将生命周期驱动Fragment到所需的状态。似乎FragmentScenario总是将Fragment被测对象置于其恢复状态。有人会假设调用moveToState(CREATED)Fragment通过它返回onCreate(),但实际上,根据文档,模拟与被测moveToState()对象交互的外部应用程序。Fragment这意味着moveToState(CREATED)移动Fragment被测对象,onPause()并且onStop()在新产品发布时会发生这种情况Activity

要将片段驱动到不同的生命周期状态,请调用 moveToState()。此方法支持以下状态作为参数:CREATED、STARTED、RESUMED 和 DESTROYED。此操作模拟包含您的片段的活动更改其状态的情况,因为它被另一个应用程序或系统操作中断。

是否有可能以某种方式直接FragmentScenario将其驱动Fragment到所需状态而不是总是经历onResume()?我们如何测试发生在内部onCreate()而不是内部的事情onResume()using FragmentScenario?我在这里错过了什么吗?

0 投票
2 回答
1157 浏览

android - Android FragmentScenario - 找不到包 androidx.fragment.app.testing

尝试在 Android 中使用 FragmentScenario 时出现此错误

这是我的简单单元测试示例:

构建.gradle(应用程序):

我错过了什么,因为几个月前这段代码有效。

0 投票
2 回答
588 浏览

android - 片段测试:只有创建视图层次结构的原始线程才能接触其视图

我挣扎了一段时间,所以我决定在这里寻求帮助......我使用的架构几乎与谷歌示例相同:GithubBrowserSample

在我的一个片段(androidTest)的测试中,我遇到了这个错误:

当我将数据提交到我的 ListAdapter 时,这部分代码会出现此错误:

仅当列表不为空时才会出现此错误...我在使用应用程序时没有遇到任何错误,但仅在测试期间。

这是我的测试的源代码:

你们知道为什么会发生这种情况以及我该如何解决吗?

0 投票
1 回答
1289 浏览

android - FragmentScenario 无法按预期工作

我使用的架构几乎与 Google 示例相同:GithubBrowserSample

这个字段被注入到我的 Fragment 类中:

在我所有的片段测试中,我得到了这个错误,它对应于通过注入实例化的字段:

当我使用 FragmentScenario 设置我的片段时会发生这种情况:

但是,当我在将 Fragment 与 FragmentScenario 一起使用之前设置它时,它可以工作:

这是我的测试的源代码:

你们知道为什么会发生这种情况以及我该如何解决吗?我真的在这方面苦苦挣扎:(

0 投票
1 回答
120 浏览

android - 从 FragmentController 移动到 FragmentScenario

我正在使用 robolectric 并将我的支持片段更新为 androidx 片段。这意味着将使用 FragmentController<> 的测试更新为推荐的 FragmentScenario。

使用 FragmentController,我可以启动它,然后我可以调用controller.get()以获取实际的片段并直接对其进行操作,进行公开调用。有没有办法用 FragmentScenario 做到这一点,并直接访问 androidx.Fragment 实例?

我想直接调用公共方法的原因是因为包含 Fragment 的 Activity 侦听 Intent,并在其包含的 Fragment 上调用方法,我想测试它的关联行为。

0 投票
1 回答
256 浏览

android - 在 AndroidGradlePlugin 3.5.0 及更高版本上为动态功能模块使用片段测试库时构建失败

所以,我试图androidx.fragment:fragment-testing:1.2.4在动态功能模块中使用片段测试库。当我使用 Android Gradle Plugin (AGP) 版本3.6.3时,它无法构建并出现错误

所以我很好奇并检查了codelab github并尝试将该项目上的AGP升级到3.6.3它可以成功构建。但 codelab 不使用动态功能。

因此,我尝试app仅在我的模块中实际运行片段测试(不包括动态功能模块),是的,它也可以成功构建。但是我仍然需要在动态功能模块中测试我的片段,所以我尝试了一个一个版本,然后当我将 AGP 版本降级到它时,3.4.1它可以成功构建。

而且我发现自从 AGP 版本3.5.0及更高版本以来,它只是无法构建并出现上述相同的错误。

所以,

但我仍然想使用 AGP 3.6.0,因为我想使用 viewBinding。

那么有谁知道如何解决上述使用动态功能模块进行片段测试的错误?

0 投票
0 回答
827 浏览

android - 使用 FragmentScenario.EmptyFragmentActivity 测试 AppCompatActivity 工具栏

对于我的测试,我在 emtpy 活动根视图容器中启动片段

在我的片段中,我将工具栏配置为提供后退按钮

所以当我运行我的测试时,我得到了一个类转换异常

所以我必须添加一个守卫

那么是否有另一种配置工具栏的方法,以便我可以使用浓缩咖啡测试后退按钮意图启动?

编辑

显然有一种方法可以创建自定义活动/容器。

0 投票
2 回答
1378 浏览

android - 片段参数为 null 使用 launchFragmentInContainer

我正在为使用safeArgsand的片段编写测试FragmentScenario,但是当我launchFragmentInContainer()使用fragmentArgs参数调用时,我得到一个异常,说参数为空。生产代码没有问题。

我的导航图:

我的测试:

当我尝试运行测试时,我得到

完整的堆栈跟踪:

编辑:

的 idList1不为 null,因为它是在构造函数中初始化的。

0 投票
1 回答
454 浏览

android-testing - 片段测试,我缺少与 ActivityScenarioRule 等效的东西

我习惯于通过在 Espresso 测试中启动包含它的 Activity 来测试我的 Fragments。这一直工作得很好,我已经能够通过添加到 ActivityScenarioRule(或 IntentsTestRule)的一些测试规则(例如 OkHttpIdlingResourceRule)来控制测试环境/执行,然后用于启动 Activity。

现在我正在转向单一活动方法并利用导航组件,我想开始单独测试我的片段。但是,为了能够做到这一点,我需要在片段测试中具有与 Activity 测试中类似的功能。ActivityScenarioRule 实现了 TestRule,但 FragmentScenario 没有实现,并且没有 FragmentScenarioRule。

我错过了什么吗?