7

我正在构建 react-native 应用程序,其中包含一些本机 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 框架,但不知道它是如何与 react native 一起工作的。有没有其他工具可以做到这一点?谁能给我一些示例或指导为 react-native 本机 android 代码编写单元测试?

4

1 回答 1

1

使用 Robolectric 4。

看我的评论。

我这样做的方式是

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

@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);
    }
}
于 2019-11-09T21:38:22.363 回答