Как вставить MockModule в DaggerAppComponent?

Я предпочитаю не изменять df.

Опция заключается в извлечении index дат start и end:

import numpy as np   
import pandas as pd

#Dummy DataFrame
df = pd.DataFrame(np.random.random((30, 3)))
df['date'] = pd.date_range('2017-1-1', periods=30, freq='D')

#Get the index of the start and end dates respectively
start = df[df['date']=='2017-01-07'].index[0]
end = df[df['date']=='2017-01-14'].index[0]

#Show the sliced df (from 2017-01-07 to 2017-01-14)
df.loc[start:end]

что приводит к:

     0   1   2       date
6  0.5 0.8 0.8 2017-01-07
7  0.0 0.7 0.3 2017-01-08
8  0.8 0.9 0.0 2017-01-09
9  0.0 0.2 1.0 2017-01-10
10 0.6 0.1 0.9 2017-01-11
11 0.5 0.3 0.9 2017-01-12
12 0.5 0.4 0.3 2017-01-13
13 0.4 0.9 0.9 2017-01-14
0
задан Chiara 13 July 2018 в 18:24
поделиться

1 ответ

Насколько я знаю, я не уверен, что мы можем объединить весь модуль, но мы можем издеваться над зависимостями, предоставляемыми модулем. Я достиг этого: мне нужно высмеять DataModule для тестирования пользовательского интерфейса, поэтому я создал этот TestDataModule и предоставил mocks для зависимости.

import com.nhaarman.mockito_kotlin.mock
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class TestDataModule {

    @Provides
    @Singleton
    fun providesDataRepository(): DataRepository {
        return mock()
    }
}

Здесь TestApplicationModule

@Module
abstract class TestApplicationModule {

    @Binds
    abstract fun bindContext(application: Application): Context
}

И создал TestApplicationComponent, который возьмет необходимые модули

@Singleton
@Component(modules = [
    (AndroidSupportInjectionModule::class),
    (TestApplicationModule::class),
    (UIModule::class),
    (PresentationModule::class),
    (TestDataModule::class)])
interface TestApplicationComponent {

    // Here you can add additional direct mock 
    // classes to access them directly from component reference
    fun dataRepository(): DataRepository 


    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): TestApplicationComponent.Builder

        fun build(): TestApplicationComponent
    }

    fun inject(app: TestAppplication)
}

Мне пришлось тестировать интерфейс с помощью Android JUnit Test runner и espresso, поэтому я использовал UIModule и Presentation Module, как есть (Can not макет, как хотелось бы проверить). Поэтому нужно издеваться над другими зависимостями, которые не являются частью этих тестов модуля UI, такими как DataRepository

. Вы можете добавить другие модули, такие как CacheModule и RemoteModules, как макеты, поскольку они не играют никакой роли в тестировании модулей UI.

Наконец, создайте DaggerTestApplicationComponent в TestApplication, как это,

class TestApplication : Application(), HasActivityInjector {

    @Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>
    private lateinit var appComponent: TestApplicationComponent

    override fun onCreate() {
        super.onCreate()
        appComponent = DaggerTestApplicationComponent.builder()
                .application(this)
                .build()
        appComponent.inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}

Итак, теперь DaggerTestApplicationComponent будет генерировать требуемый граф зависимостей.

Примечание: требуется закройте все методы, вызванные издеваемыми зависимостями

0
ответ дан adityakamble49 17 August 2018 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: