如何在 MVP 中测试读取 from/updating 文件?

How to test reading from/updating file in MVP?

我正在尝试将我的应用从没有设计模式更改为使用 MVP。

最初我有以下代码:

override fun onCreateInputView(): View {

    //favoritesData is an instance variable, same with "Gson", "parser", "favorites", and "stringArrayListType"
    favoritesData = File(filesDir, "favorites_data.json")

    if (favoritesData.exists()) {
        favorites = Gson.fromJson(parser.parse(FileReader(favoritesData)), stringArrayListType)
    }
}

fun updateFavoritesFile() {
    favoritesData.writeText(Gson.toJson(favorites))
}

尝试使用 MVP 后,我将代码更改为:

class AnimeFaceKeyboardPresenter(val view : AnimeFaceKeyboardView, private val model : KeyboardModel = KeyboardModel()) : Presenter {

    override fun onCreateInputView() {
        model.favorites = view.loadFavoritesFile()

        //At some point, call view.updateFavoritesFile(arrayListOf("test","test2"))

    }

    override fun onStartInputView() {
    }

}

和 activity 中的代码本身为:

override fun loadFavoritesFile() : ArrayList<String> {
    val favoritesData = File(filesDir, favoritesFileName)
    var favorites = ArrayList<String>()

    //"favorites" is no longer an instance variable     

    if (favoritesData.exists()) {
        favorites = Gson.fromJson(parser.parse(FileReader(favoritesData)), stringArrayListType)
    }

    return favorites
}


override fun updateFavoritesFile(favorites: ArrayList<String>) {
    File(filesDir, favoritesFileName).writeText(Gson.toJson(favorites))
}

override fun onCreateInputView(): View {
       super.onCreateInputView()

       presenter = AnimeFaceKeyboardPresenter(this)
       presenter.onCreateInputView()

}

我不确定我是否正确使用了 MVP,但如果正确,我将如何测试此代码。例如 - 编写一个调用 updateFavoritesFile(arrayListOf("test1","test2")) 并使用 loadFavoritesFile() 来检查内容是否符合预期的测试。

好吧,您可能想将您的文件重新定位到您的模型(它们与不真正属于您的视图的数据相关联)。

然后你的测试包括实例化你的模型对象,并测试可以在没有视图和演示者的情况下完成的方法(简化测试)。

我很想将您的文件抽象为某种形式的 "Repository" 对象,它知道如何读写字符串(但您不关心在哪里或如何)。您可以将存储库对象作为构造 属性 传递给您的模型。这样做的好处是您可以创建一个模拟或伪造的 Repository 对象,您可以使用它来 "feed" 测试数据和检查写入的数据,从而使模型的那部分测试更容易一些。

别忘了,在 MVP 下,您的视图不应该直接访问您的模型。我更喜欢 MVC(MVP 和 MVC 之间的极少数差异之一)。