为react-native本机android方法编写单元测试

时间:2018-04-22 03:46:00

标签: android unit-testing react-native react-native-android react-native-native-module

我正在建立react-native app,里面有一些原生的android模块 在MainApplication.java中,

protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        new VectorIconsPackage(),
        new MyCustomPackage()
    );
  }

在我的MyCustomPackage中,

public class MyCustomPackage implements ReactPackage {

  @Override
  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
  }

  @Override
  public List<NativeModule> createNativeModules(
                              ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();

    modules.add(new MyCustomModule(reactContext));

    return modules;
  }

}

我有其他几个模块,但这只是一个例子。所有功能都运作良好。现在我想将单元测试写入MyCustomModule java类中的方法。我尝试使用Robolectric框架,但不知道它是如何使用反应原生的。还有其他工具吗?任何人都可以给我一些示例或指导编写单元测试反应本机原生android代码吗?

1 个答案:

答案 0 :(得分:0)

使用Robolectric 4。

查看我的评论。

我的方式是

  1. 模拟应用程序以删除不兼容的依赖项加载。
  2. 在ReactApplicationContext中包装ApplicationContext以实例化模块。

@Config和自定义应用程序材料可能是必需的 删除robolectric无法处理的二进制依赖项,例如Bugsnag和常规的soloader。如果您所有的依赖项都可用于您的开发环境系统架构(这是极不可能的),那么也许可以工作。

@RunWith(AndroidJUnit4.class)
@Config(
    application = TestApplication.class
)
public class ReactModuleSpec {

    private ReactModule reactModule;

    @Before
    public void beforeEach() {
        // Retrieve application context.
        Context applicationContext = ApplicationProvider.getApplicationContext();

        // Recreate ReactApplicationContext which ReactModule depends upon.
        // ReactApplicationContext sole purpose as documented in its source code
        // is to preserve type integrity of ApplicationContext over Context
        // (which android Context obviously does not). This should be safe
        // thus. See my post here:
        // `https://stackoverflow.com/questions/49962298/writing-unit-test-for-react-native-native-android-methods`.
        ReactApplicationContext reactApplicationContext = new ReactApplicationContext(applicationContext);

        // Instantiate the module.
        reactModule = new ReactModule(reactApplicationContext);
    }

    // ...

}
public class TestApplication extends Application implements ReactApplication {

    // ...

    // Remove packages incompatible with Robolectric.
    @Override
    protected List<ReactPackage> getPackages() {
        List<ReactPackage> packages = new PackageList(this).getPackages();

        // ... Your standard stuffs

        packages.removeIf(pkg -> pkg.getClass().isInstance(BugsnagReactNative.getPackage().getClass()));

        return packages;
    }

    // Remove soloader !
    @Override
    public void onCreate() {
        super.onCreate();

        // Bye bye!
        // BugsnagReactNative.start(this);
        // SoLoader.init(this, /* native exopackage */ false);
    }
}