如何在 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 之间的极少数差异之一)。
我正在尝试将我的应用从没有设计模式更改为使用 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 之间的极少数差异之一)。