Но сначала я хочу запустить базовую функцию настройки, чтобы установить FragmentScenario перед каждым тестом пользовательского интерфейса.
Код: Выделить всё
private lateinit var scenario: FragmentScenario
private lateinit var mockNavController : NavController
//Annotation to be marked as @Before later
@Test
fun setUp() {
mockNavController = TestNavHostController(ApplicationProvider.getApplicationContext())
scenario = launchFragmentInContainer {
MyFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
if (viewLifecycleOwner != null) {
// The fragment’s view has just been created
fragment.requireActivity().runOnUiThread {
mockNavController.setViewModelStore(ViewModelStore())
mockNavController.setGraph(R.navigation.base_nav_graph)
Navigation.setViewNavController(fragment.requireView(), mockNavController)
}
}
}
}
}
}
Из того, что я вижу, среда FragmentScenario также выполняет те же вызовы, как если бы я запускал приложение. Помимо головной боли, вызванной ленивым созданием экземпляров LiveData внутри модели представления (подумайте: «setValue не может быть запущен в фоновом потоке») при запуске сетевых вызовов на IO, отправленном CoroutineScope, потому что мне нужны некоторые параметры запроса для вызова из этих ленивых значений LiveData , предназначено ли это поведение FragmentScenario для выполнения сетевых вызовов даже в инструментированной среде Test? Я бы предпочел предотвратить это без каких-либо условий, если это возможно.
Я обнаружил, что с помощью FragmentScenario я начинаю менять видимость моего кода с частного на общедоступный, просто чтобы получить доступ к некоторым переменных и функций. Ожидается ли это также при попытке провести инструментальные тесты?
В теме тестирования модели представления есть ли возможность издеваться над моими функциями модели представления или самим классом? Мое определение модели представления следующее:
Код: Выделить всё
class MyViewModel @AssistedInject constructor(
private val repository : MyRepository,
@Assisted val savedStateHandle: SavedStateHandle
) : ViewModel()
//and the factory
@AssistedFactory
interface MyViewModelFactory {
fun create(savedStateHandle: SavedStateHandle) : MyViewModel
}
//lazy val
val myViewModel: MyViewModel by lazy {
ViewModelProvider(findNavController().getBackStackEntry(R.id.base_nav_graph), Factory(this) { stateHandle ->
appComponent.myViewModel()
.create(stateHandle)}).get(MyViewModel::class.java)
}
Если я смогу имитировать ViewModel для условий и функций сетевого вызова, это может быть упростите тестирование, если я хочу изолировать тестовый запрос с помощью фиктивных данных.
Подробнее здесь: https://stackoverflow.com/questions/790 ... launch-and